synchronized你到底锁住的是谁?

synchronized从语法的维度一共有3个用法:

1、静态方法加上关键字

2、实例方法(也就是普通方法)加上关键字

3、方法中使用同步代码块

前两种方式最为偷懒,第三种方式比前两种性能要好。

synchronized从锁的是谁的维度一共有两种情况:

锁住类

锁住对象实例

1)静态方法上的锁

静态方法是属于“类”,不属于某个实例,是所有对象实例所共享的方法。也就是说如果在静态方法上加入synchronized,那么它获取的就是这个类的锁,锁住的就是这个类。

2)实例方法(普通方法)上的锁
实例方法并不是类所独有的,每个对象实例独立拥有它,它并不被对象实例所共享。在实例方法上加入synchronized,那么它获取的就是这个类的对象的锁,锁住的就是这个对象实例。

synchronized(this){...}

this关键字所代表的意思是该对象实例,换句话说,这种用法synchronized锁住的仍然是对象实例,他和public synchronized void demo(){}可以说仅仅是做了语法上的改变。

synchronized(Demo.class){...}

这种形式等同于抢占获取类锁,锁住的是这个类。

posted @ 2020-02-06 18:23  gaopengpy  阅读(216)  评论(0编辑  收藏  举报