二十二 synchronized同步方法
一 Synchronized锁:
1 synchronized取得的锁都是对象锁,而不是把一段代码或方法加锁。
synchronized是给该方法的实例对象加锁。如果多个线程访问的是同一个对象
的synchronized方法,就可以同步。
2 对象中的非synchronized类型的方法是不需要等待锁的。
3 不同的synchronized方法之间也是互斥的,因为锁的是对象!
二 Synchronized锁重入:
1 synchronized具有锁重入的功能,同一个线程可以多次获得一个对象的锁。也就是说:一个synchronized方法内部调用本类的其他synchronized方法时,是永远 可以得到锁的。
2 可重入锁也支持在父子继承的情况下。
3 出现异常情况,锁自动释放。当一个线程执行的代码出现异常时,其所有的锁会自动释放。
4 子类继承父类的同步方法时,如果希望也是同步方法需要加上synchronized关键字。
三 synchronized同步语句块
1 控制的粒度更细致,效率更高。
2 synchronized (this)
3 当一个线程访问object的一个synchronized(this)同步代码块,其他线程对同一object中所有的其他synchronized(this)同步代码块的访问都将被阻塞,说明synchronized使用的“对象监视器”是一个。
四 将任意对象作为对象监视器
多个线程调用同一个对象中的不同名称的synchronzied同步方法或synchronzied(this)同步代码块时,调用的效果就是按顺序执行,也就是同步,阻塞。
锁非this对象的优点:比如一个类中四个方法,方法1和2需要同步,方法3和4需要同步,这个时候就可以用非this的锁,效率高。
五 静态同步synchronized方法与synchronized(class)代码块
关键字synchronized还可以用在static静态方法上,这样写,是对当前类加锁。
类锁可以对类的所有对象实例起作用。