首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
synchronized可以加在方法上,也可以加在对象上,通常理解为,只有持有了锁才可以进行对应代码块的执行。
java.util.concurrent.locks包下面提供了一些锁的实现,有读写锁,公平锁等。
将synchronized替换成lock的实现可以提升性能:
1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而synchronized则是都互斥。可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。
2. 要确保你在理解原来利用到synchronized的代码逻辑,避免一概而论地把synchronized替换成锁。
|