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

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

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

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;
    }
}

运行效果如下:

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

posted @ 2020-09-05 18:34  风暴松鼠  阅读(235)  评论(0)    收藏  举报