synchronized最关键的就是确定锁的对象,我认为有两种,类和对象:
一、类
对类的加锁有两种方法:
1.public synchronized static void fun(){};
在静态方法前加上synchronized关键字。
2.synchronized(类名.class){};
将加锁的代码块的锁的位置,写上类对象。可以用实例对象.getClass()代替,也可以写其他类名,不一定是自己的类名。
二、实例对象
对实例对象的加锁也有两种方法:
1.public synchronized void fun(){};
在方法前加上synchronized关键字。
2.synchronized(对象){};
将加锁的代码块的锁的位置,写上实例对象。可以用实例对象this代替,同样,到底是什么实例对象,就随意了,不一定非要自己这个实例对象。
额外要注意的是:
如果对于实例对象的加锁没有特殊要求的话,可以使用byte[] byte = new byte[0];代替,因为这个效率高,其他的需要7条操作码,他只需3条。
三、机制
synchronized关键字是针对对象而设计的锁。每个对象只能加一次锁,一旦该对象被加锁,即触发了synchronized的方法或代码块,该对象就必须等这个锁结束(即对应的代码块或方法执行完毕)才能再次加锁。