synchronized和ReentrantLock有什么区别

一、synchronized和ReentrantLock的区别

synchronized是Java内置的同步机制,它提供了互斥的语义和可见性。当一个线程已经获取当前锁时,其他试图获取的线程只能等待或阻塞在哪里。在Java5之前,synchronized是唯一的同步手段。在代码中,synchronized可以修饰方法,也可以用在特定的代码块上。

ReentrantLock,重入锁,是Java5提供的锁实现,ReentrantLock在加锁和内存上提供的语义与内置锁相同,此外他还提供了一些情况功能。包括锁的定时等待,可中断的锁等待,公平性,以及非块结构的加锁。

在synchronized和ReentrantLock的性能方面,早期版本synchronized在很多场景下性能相差较大,在后续版本进行了较多改进,在低竞争场景中表现可能优于ReentrantLock。

二、ReentrantLock的特性

1.可中断的锁等待

对于synchronized来说,其等待锁只有两种情况,要么获取锁继续执行,要么继续等待。对于重入锁来说,它提供了另一种可能性,那就是在等待锁的过程中,线程可以取消对锁的请求。

2.锁的定时等待

锁的定时等待,就是给锁设定一个等待时间。如果过了等待时间线程还没有获取锁,那么线程就自动放弃获取该锁。

3.公平锁

大多数情况下锁都是非公平的,包括内置锁。但是ReentrantLock提供了公平锁的选项,也就是先来的先处理,后来的后处理,不能插队。因为涉及更多的线程上下文切换,公平锁的性能比较低下。

三、ReentrantLock的几个方法

  • lock():获得锁,如果锁已经被占用,则等待。
  • lockInterruptibly():获得锁,但是优先响应中断。
  • tryLock():尝试获得锁,如果成功返回true,失败返回false。该方法不等待,立即返回。
  • tryLock(long time,TimeUnit unit):在给定时间内尝试获得锁。
  • unLock():释放锁。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值