并发十:内置锁、显式锁使用总结

1、与synchronized相比ReentrantLock拥有非阻塞的获取锁、响应中断、超时机制、支持公平性设置等特性,这些特性是在这两种锁进行选择时的依据,而不是性能,JDK6之后内置锁引入了基于CAS的偏向锁、轻量级锁,以及JVM中的锁消除、锁粗化等优化手段,synchronized的性能不再是诟病。

2、ReentrantLock也会出现死锁,出现死锁的原因大都在于锁未释放,所以unlock一定要放在 finally中。

3、不管哪一种锁都会带来一定的性能损耗,使用锁时要尽量减少持有锁的时间,即避免在临界区内进行耗时计算。

3.1:尽量减少锁的作用域范围,即临界区内的代码越短越好(lock...unlock之间)。

3.2:能使用共享锁时尽量避免使用独占锁,如ReadWriteLock就比ReentrantLock的吞吐量高。

3.3:必要时进行分拆锁和分离锁,如ConcurrentHashMap的实现中,内部的数组被分成16段,每段单独加锁,使得每把锁的请求时间缩短,能支持更高的吞吐量,最好的情况下可以支持16个线程同时写入。

码字不易,转载请保留原文连接https://www.jianshu.com/p/be9298b272e7

推荐阅读更多精彩内容