synchronized
用法:
a) synchronized aMethod() {}
b) bMethod() { synchronized( this ) {} }
c) cMethod( Object object ) { synchronized( object ) {} }
d) synchronized static dStaticMethod {}
e) eStaticMethod { synchronized( 类.class ) {} }
1、synchronized 关键字的作用域有对象和类两种
-- a、b、c 锁的范围是对象;d、e 锁的范围范围是类
2、每个对象都包含了唯一的一把锁(也叫作“监视器”);每个类也有唯一的一把锁。
-- a、b 锁在当前对象上;d、e 锁在类上;c 锁在object对象上
3、a、b 效果相同;d、e 效果相同
-- e 不能用类实例.getClass(),因为用classInstance.getClass()达不到锁这个Class的目的
(注意 A.class == a.getClass)
4、c 的最好实现如下,只需3条操作码
private byte[] lock = new byte[0]
synchronized(lock) { //… }
烂七八糟:
synchronized aMethod() { }
1、获得当前对象锁。防止多个线程同时访问这个对象的 aMethod 方法。
2、一个对象只能有一个锁。
3、如果对象有多个synchronized方法,访问了其中的一个synchronized方法,其它线程不能再访问这个对象的任意synchronized方法。
4、同类对象的不同实例的 synchronized 方法是不相干扰的。
synchronized static aStaticMethod{}
1、获得当前类的锁。防止多个线程同时访问这个类的 aStaticMethod 方法。
2、对类的所有对象实例都起作用,一个类只有一个锁。
3、P1.getClass() 不能当类的锁
synchronized关键字是不能继承的
synchronized关键字取得的锁都是对象,不是把一段代码或函数当作锁
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
synchronized 可作用于instance变量、对象引用、static函数 和class literals(类名称字面常量)身上