Synchronized和Reentrantlock区别是什么?简单叙述

XIAO 2020-04-17 14:57:15 java常见问答 4772

如果说是接触过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一些知识问答就记得关注本站哦。