企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 同步代码块以及同步方法之间的区别和关系 上一篇文章我们是使用了同步代码块的方式改进了银行排队取号程序,接下来我们把锁放在方法上试一下: ```java 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++)); //} } } } ``` 运行效果如下: ![](https://img.kancloud.cn/a6/36/a636550bc7f5d886c65dbd59a3e7ec64_960x246.gif) 其实理解起来也很简单,就是一个线程争到了run方法的同步锁,因为一直在方法里,没退出,所以锁没有得到释放,就一直执行到结束啦,接下来我们来改进代码: ```java public class TicketWindowRunnable implements Runnable { private int index = 1; private static final int MAX = 50; @Override public synchronized 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; } } ``` 运行效果如下: ![](https://img.kancloud.cn/8b/ad/8badc9854204b9c8caf7e6c09ac5beb3_960x246.gif) 这里就和我们之前同步代码块的方式一样了,所以不是哦那个不方法不好用,而是具体使用什么方式要接合业务场景去使用。不过尽量还是小范围去加比较好。