码迷,mamicode.com
首页 > 其他好文 > 详细

同步代码块以及同步方法之间的区别和关系

时间:2020-09-17 15:37:44      阅读:19      评论:0      收藏:0      [点我收藏+]

标签:false   current   err   interrupt   sync   mamicode   index   区别   turn   

同步代码块以及同步方法之间的区别和关系

上一篇文章我们是使用了同步代码块的方式改进了银行排队取号程序,接下来我们把锁放在方法上试一下:

public class TicketWindowRunnable implements Runnable {
    private int index = 1;
    private static final int MAX = 50;
    private final Object MOINTOR = new Object();
    @Override
    public synchronized void run() {
        while (true) {
             //(MOINTOR){
                if (index >= MAX)
                    break;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
            //}
        }
    }
}

运行效果如下:
技术图片

其实理解起来也很简单,就是一个线程争到了run方法的同步锁,因为一直在方法里,没退出,所以锁没有得到释放,就一直执行到结束啦,接下来我们淡出抽出来一个方法来执行业务,然后synchronized他,代码如下:

public class TicketWindowRunnable implements Runnable {
    private int index = 1;
    private static final int MAX = 50;
    @Override
    public void run() {
        while (true) {
            if (ticket()) {
                break;
            }
        }
    }

    private synchronized boolean ticket() {
        if (index > MAX) {
            return true;
        }
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
        return false;
    }
}

运行效果如下:
技术图片

这里就和我们之前同步代码块的方式一样了,所以不是同步方法不好,而是具体使用什么方式要接合业务场景去使用。不过尽量还是小范围去加比较好。

同步代码块以及同步方法之间的区别和关系

标签:false   current   err   interrupt   sync   mamicode   index   区别   turn   

原文地址:https://www.cnblogs.com/stormsquirrel/p/13619166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!