Java中Lock和LockSupport的区别到底是什么

小编 179

Java中Lock和LockSupport的区别是:Lock是一个接口,它定义了锁获取和释放的基本操作;而LockSupport是用来创建锁和其他同步类的基本线程阻塞原语,它定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能。

1.Lock

Lock是java.util.concurrent.locks包下的接口,定义了锁获取和释放的基本操作。它比同步方法和同步块提供了更具扩展性的锁操作,这些方法允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。

Lock接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括hand-over-hand 和锁重排算法)中使用这些规则。

Lock中的lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()是用来获取锁的;而unLock()方法是用来释放锁的。

2.LockSupport

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语,它定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。

LockSupport中的park() 和unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和Thread.resume所可能引发的死锁”问题。

在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker,long nanos) 和parkUntil(Object blocker,long deadline)3个方法,用于实现阻塞当前线程的功能,其中参数blocker是用来标识当前线程在等待的对象(以下称为阻塞对象),该对象主要用于问题排查和系统监控。

延伸阅读

Java中Lock和Synchronized的区别是什么

区别一,Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问。

区别二,由于Synchronized是悲观锁,他会一直等等待对象头锁信息,阻塞的,不可被打断的。而Lock可以判断是否获取锁,并且可以不一定等待获取到锁,可以结束自己。

区别三,Lock必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。而Synchronized是自动上锁和自动释放锁,他会在编译class的时候产生两句原语:mintorenter,minorexit,代表上锁和推出锁。

区别四,Lock是可以决定重入锁,可以设置公平性,可以判断锁状态,如果没有能力获取锁则不会死锁,不会一直等待获取锁。而Synchronized是可重入的锁,不可以中断的,非公平的(处于性能考虑)。

区别五,Synchronized是重量级锁,不适合大量代码。Lock可以,lock锁的粒度更细,分为读锁写锁等。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部