synchronized是java中最基本的互斥同步手段,synchronized关键字经过编译后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码指令需要一个reference类型的参数来指明要锁定和解锁的对象。如果在java程序中没有指明这个reference,那就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或class对象作为所对象。使用synchronized时有两点值得注意,一是synchronized同步块对于同一条线程来说是可重入的,不会出现自己把自己锁死的问题。其次,同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。
ReentrantLock与synchronized在基本用法上很相似,他们都具备一样的线程重入特性。不过相比较synchronized,ReentrantLock增加了一些高级功能,主要是以下3项:等待可中断、可实现公平锁、锁可以绑定多个条件。
等待可中断是指当持有锁的线程长时间不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事,可中断特性对处理执行时间非常长的同步块很有帮助
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁
锁绑定多个条件是指一个ReentrantLock对象可以同时绑定多个condition对象,而synchronized中,锁对象的wait()和notify()或notifyAll()方法可以实现一个隐含的条件,如果要和多于一个条件关联的时候,就不得不额外的田间一个锁
在jdk1.6之后synchronized和ReentrantLock的性能基本上完全持平,如果程序是使用jdk1.6或以上部署的话,性能因素就不再是选择ReentrantLock的理由了,虚拟机在未来的性能改进中也会更加偏向于synchronized,所以还是提倡在synchronized能实现的需求的情况下,优先考虑使用synchronized来进行同步。
ReentrantLock与synchronized在基本用法上很相似,他们都具备一样的线程重入特性。不过相比较synchronized,ReentrantLock增加了一些高级功能,主要是以下3项:等待可中断、可实现公平锁、锁可以绑定多个条件。
等待可中断是指当持有锁的线程长时间不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事,可中断特性对处理执行时间非常长的同步块很有帮助
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁
锁绑定多个条件是指一个ReentrantLock对象可以同时绑定多个condition对象,而synchronized中,锁对象的wait()和notify()或notifyAll()方法可以实现一个隐含的条件,如果要和多于一个条件关联的时候,就不得不额外的田间一个锁
在jdk1.6之后synchronized和ReentrantLock的性能基本上完全持平,如果程序是使用jdk1.6或以上部署的话,性能因素就不再是选择ReentrantLock的理由了,虚拟机在未来的性能改进中也会更加偏向于synchronized,所以还是提倡在synchronized能实现的需求的情况下,优先考虑使用synchronized来进行同步。