Lock与synchronized

什么是Lock?

Lock接口提供了与synchronized关键字类似的同步功能,只是在使用时显示地获取和释放锁,虽然缺少了隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性,可中断的获取锁以及超时获取锁等多种synchronized不具备的同步特性

 

使用synchronized关键字将会隐式地获取锁,但是扩展性没有显示的锁好。

Lock的经典使用方式:

在finally中释放锁,目的是保证在获取到锁后之后,最终能够被释放

注意:不要讲锁的获取写在try块中,因为如果在获取锁时发生了异常,异常抛出的时候,锁也会被释放

 

Synchronized与Lock的底层原理

Synchronized:主要是基于两个指令monitorenter与monitorexit

Lock:基于volatile和CAS实现的

 

Lock与synchronized的区别?

1)Lock会尝试非阻塞地获取锁

2)能够中断地获取锁

3)可以超时地获取锁

 

 

Lock是一个接口,定义了锁获取与释放的基本操作

void lock() 获取锁

void lockInterruptibly()throws InterruptedException  可中断地获取锁,能够在锁获取过程中响应中断

boolean tryLock()      尝试非阻塞地获取锁

boolean tryLock(long time,TimeUnit unit)throws InterruptedException    超时的获取锁,有三种情况

1)当前线程在超时时间内获得了锁

2)当前线程在超时时间内被中断

3)超时时间结束,返回false

 

void unlock() 释放锁

Condition newCondition()  获取等待通知组件,该组件与当前的锁绑定,当前线程只有获取了锁,才能调用该组件的wait()方法,调用后当前线程会释放锁

 

 

ReentrantLock可重入锁?

ReentrantLock能够支持一个线程对资源的重复加锁,并且还支持公平锁与非公平锁的选择

Mutex就不是一个可重入锁(重复获取锁会阻塞线程)

Synchronized隐式地支持重入

ReentrantLock不支持隐式地重入,但是能够在调用lock()的方法里,,再次调用lock()方法获取锁而不被阻塞

 

 

公平性与非公平性?

公平锁,线程将按照他们发出请求的顺序来获得锁,但在非公平锁上,允许插队。一个线程请求非公平锁时,如果该锁刚好被释放,那么此线程将跳过队列直接获取该锁

不过我们不希望都是公平性的锁,因为公平性在挂起线程和恢复线程存在的开销会极大地降低性能。在激烈的竞争条件下,非公平锁的性能高于公平锁的原因是:在恢复一个被挂起的线程与该线程真正开始运行之间存在严重的延迟

 

ReentrantLock与synchronized的选择?

仅当内置锁不能满足需求时,才使用ReentrantLock(比如可定时的,可中断的,可轮询的,公平队列)

 

参考书籍:《Java并发编程的艺术》  《Java并发编程实战》

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值