synchronized 深入理解
下看下面代码
大家猜猜日志应该是怎么样。
--aa--
--aa等等10秒--
---bb-
--bb等等10秒--
日志如上 不知道你猜到了吗
为什么会这样 因为加了一把类对象锁 SysThread.class
在类型内部可以理解有一个monitor方法。
把加锁的通知 告诉monitor ,等结束在告诉monitor
同理 如果
synchronized 放到方法 这个monitor对象 就是所在对象。
synchronized 放到静态方法 这个monitor对象 就是所在类对象。
这样大家可以理解了
如果在一类上 所有方法 synchronized 所有方法都是串行
而不是 每个方法是串行。
synchronized 看看加锁的恐怖了。还敢随便枷锁吗?
package demo.thread; public class SysThread { public static void main(String[] args) { Thread aa =new Thread(new AA()); Thread bb =new Thread(new BB()); aa.start(); bb.start(); } } class AA implements Runnable { @Override public void run() { synchronized (SysThread.class) { System.out.println("--aa--"); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class BB implements Runnable { @Override public void run() { synchronized (SysThread.class) { System.out.println("---bb-"); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }