如果说是接触过java相关软件开发的话,人家一提到锁,相信你第一时间想到的可能就是同步锁Synchronized了,其实还有与其有相同的并发性和内存语义另一种锁,名为reentranlock,下面小编就带有兴趣的小伙伴一起来看看,sychronized跟Reentranlock两种锁的具体区别究竟是什么呢?
API层面的区别如下:
synchronized即可以修饰方法,也可以修饰代码块的。
Synchronized在修饰方法时,方法如下所示:
//synchronized修饰一个方法时,这个方法叫同步方法 public synchronized void test() { //方法体 }
Synchronized在修饰代码块时,包括了两个部分:锁对象的引用和这个锁保护的代码块。方法如下所示:
synchronized(0b ject) { //括号中表示需要锁的对象 //线程执行时会对object上锁 }
ReentrantLock使用如下所示:
public class test() { private Lock lock = new ReentrantLock(); public void testMethod() { try { lock.lock(); //code } finally { lock.unlock(); } } }
等待可中断的区别:
其实具体说来,如果说业务代码中有两个线程,ThreadAThreadB.假设ThreadA获取了对象object的锁,ThreadB将等待ThreadA释放object的锁。
使用synchronized。如果ThreadA不释放,ThreadB将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁的角色,一个线程引用锁的时候,别的线程阻塞等待。
使用ReentrantLock。如果ThreadA不释放,ThreadB等待了很长时间以后,可以中断等待,转而去做别的事情。
绑定多个条件的区别:
ReentrantLock是可以同时绑定多个Condition对象的,需多次调用newCondition方法。
synchronized中,锁对象的wait和notify() 或notifyAll()方法是可以实现一个隐含的条件的。但是如果要和一个条件关联的时候就不得不额外添加一个锁。
性能上的区别:
在JDK 1.5中,synchronized还有很大的优化余地。在JDK 1.6 中加入了很多针对锁的优化措施,synchronized与ReentrantLock性能方面基本上是持平的。而且虚拟机在未来的改进中更偏向于原生的synchronized的。
那么以上就是Synchronized和Reentrantlock的区别有关内容了,还想了解更多java一些知识问答就记得关注本站哦。