参考:关于synchronized和ReentrantLock之多线程同步详解
看了一些并发的文章和书籍,举了一些ReentrantLock和Condition的例子。很多时候纠结在Condtion的使用上了。仔细想一想,其实使用Condition这些例子使用传统的“对象”和“synchronized”进行锁的方式也是可以实现的,只是有些时候没有ReentrantLock实现起来那么漂亮。重点其实还是在“是否可中断”、“公平锁”、“读写锁”上。
所以什么时候应该使用synchronized?什么时候应该使用ReentrantLock呢?下面列举一下各自功能:
功能 | synchronized | ReentrantLock |
---|---|---|
可中断锁 | X | O |
公平锁 | X | O |
非公平锁 | O | O |
读写锁 | X | O |
绑定多个条件 | X(可以用多个锁实现) | O |
注释:
1,性能方面,由于synchronized也在不断优化,所以性能上差不多。但如果是使用ReentrantLock的读写锁,性能方面还是差很多的。
2,绑定多个条件。ReentrantLock使用的是Condition进行处理的,而如果使用Synchornized方式的话,要使用多个“对象锁”或结合volatile或原子类进行实现。例如:javadoc上的生产者和消费者的例子,就可以用3个“对象锁”做出来。但从可读性或优雅性上来看,还是ReentrantLock好一点。