Erlo

两线程交替打印数字

时间:2020-10-18   阅读:8次   来源:博客园
页面报错
点赞

加锁实现
//两线程交替打印1-20
public class Main{
    public static void main(String[] args){
        Object lock=new Object();
        final int maxNum=20;
        new Thread(()->{
            for(int i=1;i<maxNum;i+=2){
                synchronized (lock){
                    System.out.print(i+" ");
                    lock.notify();
                    try {
                        if(i<maxNum-1){
                            lock.wait();
                        }
                    } catch (InterruptedException e) {}
                }
            }
        }).start();
        new Thread(()->{
            for(int i=2;i<=maxNum;i+=2){
                synchronized (lock){
                    System.out.print(i+" ");
                    lock.notify();
                    try {
                        if(i<maxNum){
                            lock.wait();
                        }
                    }catch (InterruptedException e){}
                }
            }
        }).start();
    }
}
无锁实现
//两线程交替打印1-20
public class Main{
    public volatile static boolean flag=true;
    public static void main(String[] args){
        final int maxNum=20;
        new Thread(()->{
            for(int i=1;i<maxNum;i+=2){
                while (!flag);
                if(flag){
                    System.out.print(i+" ");
                    flag=false;
                }
            }
        }).start();
        new Thread(()->{
            for(int i=2;i<=maxNum;i+=2){
                while (flag);
                if(!flag){
                    System.out.print(i+" ");
                    flag=true;
                }
            }
        }).start();
    }
}

最后对于while(flag);可以改写为while(flag) Thread.onSpinWait();代表flag==false时自旋。

相关推荐

提交留言

评论留言

还没有评论留言,赶紧来抢楼吧~~

吐槽小黑屋()

* 这里是“吐槽小黑屋”,所有人可看,只保留当天信息。

  • Erlo吐槽

    Erlo.vip2020-10-21 23:37:00Hello、欢迎使用吐槽小黑屋,这就是个吐槽的地方。
  • 返回顶部