synchronized你到底锁住的是谁?
synchronized从语法的维度一共有3个用法:
1、静态方法加上关键字
2、实例方法(也就是普通方法)加上关键字
3、方法中使用同步代码块
前两种方式最为偷懒,第三种方式比前两种性能要好。
synchronized从锁的是谁的维度一共有两种情况:
锁住类
锁住对象实例
1)静态方法上的锁
静态方法是属于“类”,不属于某个实例,是所有对象实例所共享的方法。也就是说如果在静态方法上加入synchronized,那么它获取的就是这个类的锁,锁住的就是这个类。
2)实例方法(普通方法)上的锁
实例方法并不是类所独有的,每个对象实例独立拥有它,它并不被对象实例所共享。在实例方法上加入synchronized,那么它获取的就是这个类的对象的锁,锁住的就是这个对象实例。
synchronized(this){...}
this关键字所代表的意思是该对象实例,换句话说,这种用法synchronized锁住的仍然是对象实例,他和public synchronized void demo(){}可以说仅仅是做了语法上的改变。
synchronized(Demo.class){...}
这种形式等同于抢占获取类锁,锁住的是这个类。