synchronized的用法大致分为3类
- synchronized修饰实例方法
例如synchronized void a(){}
- synchronized修饰类方法
例如synchronized static void a(){}
- synchronized修饰任意对象
例如synchronized(new Object()){}
其实第一二种情况可以归为第三种情况,修饰实例方法就相当与当前的类的实例对象作为监视器,而修饰类方法相当于将当前的这个类作为监视器。
synchronized void a(){}
等同于synchronized (this){}
synchronized static void a(){}
等同于synchronized (this.getClass()){}
(唯一的区别就是右边的要放在一个方法里面运行)
所以我们只需要研究第三种情况就行了。
总而言之一句话:修饰同一个对象的的所有线程同步执行,修饰不同对象的所有线程异步执行。
即使有100个线程修饰的都是同一个对象,这些线程中被修饰的代码也只能一个接一个执行,不能并发。这个对象就是锁。