Java在保证线程安全问题上可以从两个层面来保证线程安全:
- 1、JVM层面,JVM层面保证线程安全是通过synchronized来实现的
- 2、Java API,Java API方面可以通过JUC并发包中的ReentrantLock来实现
在JDK1.5之前synchronized的性能是弱于ReentrantLock的,但是在JDK1.5之后,对synchrnized进行了一些优化,使得synchronized跟ReentantLock在性能上差别不大,JDK1.5之后主要对synchrnized的优化有:适应性自旋锁、锁消除、锁粗化、轻量级锁、偏向锁等。
但是相比synchrnized来说,ReentantLock增加了三大高级功能,分别是:
- 1、等待可中断:等待可中断是指当持有锁的线程长期不释放锁,那么正在等待的线程可以选择放弃等待,转而处理其它事情。可中断的特性对于处理执行时间非常长的同步块有很好的帮助。
- 2、公平锁:公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来获得锁,可以理解为操作系统中的先来先服务。synchrnized是非公平锁,任何一个等待锁的线程都有可能获得锁,ReentrantLock默认情况下也是非公平的,但是可以通过构造函数来设定使用公平锁。
- 3、锁可以绑定多个条件:锁可以绑定多个条件是指ReentrantLock可以绑定多个Condition对象,而在synchronized中,锁对象的wait()、notify()、notifyAll()方法可以实现一个隐含的条件,如果要和多个条件进行关联时,就不得不多添加锁,而ReentrantLock则无需这样做,只需要多次调用newCondition()方法就可以实现。