水下功夫做透,水上才能顺风顺水。

synchronized关键字

一. synchronized的三种应用方式
1.作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁;(一例一锁,两例两锁)
一个对象一把锁说的就是这个,当线程获取了该对象的锁后,其他线程无法获取该对象的锁,当然就访问不了该对象的synchronized方法,可以访问该对象的其他未被synchronized修饰的方法。
2.作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁;(一类一锁,多例一锁)
如果线程A调用一个实例的非static synchronized方法,而线程B调用这个实例所属类的静态 synchronized方法,不会发生互斥现象,因为占用的锁是当前类的class对象的锁和当前实例对象锁。

3.作用于代码块,这需要指定加锁的对象,对所给的指定对象加锁,进入同步代码前要获得指定对象的锁。
Synchronized($this){
}

Synchronized(xxx.class){
}

当两个synchronized方法同为普通方法或者静态方法时,不能同时调用;否则可以调用。这是因为,当调用synchronized普通方法时,锁住的是当前的this,而调用synchronized锁住的是当前类的字节码;两个方法锁住对象不同,所以可以同时调用。

posted @ 2020-05-17 13:09  北方寒士  阅读(111)  评论(0编辑  收藏  举报