显式锁:高级功能,轮询,定时,中断,公平性: 非公平发出请求时锁可用可以直接抢,否则也要排队,公平的只要锁不可用或前面有人就去排队
公平性很好,但没必要,而且会带来性能问题(挂起和恢复线程的开销,恢复线程到线程真正运行有不少延迟,非公平锁在这段时间内可让其他线程可完成加解锁操作),统计上的公平性保证(线程最终能获得锁)就好了
非块结构(不基于代码块,加锁解锁可能不在同一栈帧),千万不要忘记在finally里解锁
lock.lock();
try {
} finally {
lock.unlock();
}
目前synchronized性能接近显式锁,以前不如
内置锁:统计上公平,安全,线程转储中看到加锁和死锁信息更多(栈帧相关),优化(锁消除,锁粒度粗化,轻量级,偏向等),所以推荐内置锁,当需要高级功能用显式锁
读写锁:(Reentrant)ReadWriteLock 在多读少写的情况下性能提升,实现需要考虑多个问题
可重入,可降级(加写锁,加读锁,释放写锁),不可升级(会导致死锁,两个线程同时升级又都不肯放弃自己的读锁)
公平:等待时间最长的优先获取,现在读锁中,又一个读请求来了,若无写锁请求在排队可直接获取,否则去排队,现在写锁中,各种请求都去排队
非公平:见ReadWriteLock专栏分析