ReentrantLock和Synchronized的区别?

相同点:
两者都是可重入锁,他们的加锁方式都是同步,而且都是阻塞式的同步,也就是说当一个线程获得了对象锁,进入了同步块,其它访问概统不快的线程都必须阻塞在同步块外面等待。
不同点:

  1. 原始构成:Synchronized是Java语言的关键字,是原生层面的互斥,需要jvm实现;而ReentrantLock是JDK1.5之后提供的API层面的互斥锁类。
  2. 实现:Synchronized是通过JVM来加锁和解锁;ReentrantLock是API层面的加锁和解锁。
  3. 代码编写:Synchronied不需要用户去手动释放锁,当Synchronied方法或者代码块执行完之后,系统会自动让线程释放对锁的占用,更安全;而ReentrantLock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致死锁现象。
  4. 等待可中断:Sychronied不可中断,直到代码执行完,才正常释放锁,除非抛出异常,由JVM退出等待;ReentrantLock在持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,可以通过tryLock来设置超时时间,时间过了之后就放弃等待,同时可以将lockInterruptibly()方代码块中,调用interrupt()方法来中断,但是Synchronied不行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ReentrantLockSynchronizedJava中用于实现锁的两种机制,它们有以下区别[^1][^1]: 1. 实现方式:Synchronized是JVM隐式实现的,而ReentrantLockJava语言提供的API。 2. 公平性:ReentrantLock可以设置为公平锁,即按照线程请求锁的顺序来获取锁,而Synchronized不具备公平性。 3. 代码块范围:ReentrantLock只能修饰代码块,而Synchronized可以用于修饰方法、修饰代码块等。 4. 锁的获取和释放:ReentrantLock需要手动加锁和释放锁,即需要在代码中显式地调用lock()方法来获取锁,并在合适的位置调用unlock()方法来释放锁。而Synchronized不需要手动释放锁,当Synchronized修饰的代码块执行完毕或者发生异常时,会自动释放锁。 5. 锁的可中断性:ReentrantLock提供了可中断的获取锁的方式,即可以通过lockInterruptibly()方法来获取锁,而Synchronized在获取锁时是不可中断的。 6. 锁的可见性:ReentrantLock具备可见性,即一个线程在获取锁之前对共享变量的修改对其他线程是可见的,而Synchronized也具备可见性。 7. 锁的状态获取:ReentrantLock可以通过tryLock()方法尝试获取锁,并返回是否成功获取锁的结果,而Synchronized无法直接获取锁的状态。 综上所述,ReentrantLockSynchronized在实现方式、公平性、代码块范围、锁的获取和释放、锁的可中断性、锁的可见性以及锁的状态获取等方面存在差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GraysonWP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值