深入浅析Java中锁的并发性

本篇文章给大家分享的是有关深入浅析Java中的 concurrency锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁"。

同步锁

  即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支持同步锁了。

  同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才能继续运行。这就是,多线程通过同步锁进行同步的原理!  

JUC包中的锁 

  相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁,只是它的用法更难罢了。

  JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类,ReentrantLock独占锁,ReentrantReadWriteLock读写锁。由于CountDownLatch,CyclicBarrier和Semaphore也是通过AQS来实现的;因此,我也将它们归纳到锁的框架中进行介绍。

  先看看锁的框架图,如下所示。

深入浅析Java中的 concurrency锁


  JUC包中的 Lock 接口支持那些语义不同(重入、公平等)的锁规则。所谓语义不同,是指锁可是有"公平机制的锁"、"非公平机制的锁"、"可重入的锁"等等。"公平机制"是指"不同线程获取锁的机制是公平的",而"非公平机制"则是指"不同线程获取锁的机制是非公平的","可重入的锁"是指同一个锁能够被一个线程多次获取。 

  ReadWriteLock 接口以和Lock类似的方式定义了一些读取者可以共享而写入者独占的锁。JUC包只有一个类实现了该接口,即 ReentrantReadWriteLock,因为它适用于大部分的标准用法上下文。但程序员可以创建自己的、适用于非标准要求的实现。 


  AbstractQueuedSynchronizer就是被称之为AQS的类,它是一个非常有用的超类,可用来定义锁以及依赖于排队阻塞线程的其他同步器;ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier和Semaphore等这些类都是基于AQS类实现的。AbstractQueuedLongSynchronizer 类提供相同的功能但扩展了对同步状态的 64 位的支持。两者都扩展了类 AbstractOwnableSynchronizer(一个帮助记录当前保持独占同步的线程的简单类)。

  LockSupport提供“创建锁”和“其他同步类的基本线程阻塞原语”。 

  LockSupport的功能和"Thread中的Thread.suspend()和Thread.resume()有点类似",LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程。但是park()和unpark()不会遇到“Thread.暂停和Thread.resume所可能引发的死锁”问题只

条件需要和锁联合使用,它的作用是代替对象监视器方法,可以通过等待(),信号()来休眠/唤醒线程。
条件接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用对象。等待访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个锁可能与多个条件对象关联。为了避免兼容性问题,条件方法的名称与对应的对象版本中的不同只


ReentrantLock是独占锁。所谓独占锁,是指只能被独自占领,即同一个时间点只能被一个线程锁获取到的锁.ReentrantLock锁包括“公平的ReentrantLock"和“非公平的ReentrantLock"干净公平的ReentrantLock"是指“不同线程获取锁的机制是公平的”,而“非公平的ReentrantLock"则是指“不同线程获取锁的机制是非公平的“,ReentrantLock是“可重入的锁“。

ReentrantLock的UML类图如下:

深入浅析Java中的并发锁

(01) ReentrantLock实现了锁接口。
(02) ReentrantLock中有一个成员变量同步,同步是同步类型;同步是一个抽象类,而且它继承于aq。
(03) ReentrantLock中有“公平锁类“FairSync和“非公平锁类“NonfairSync,它们都是同步的子类.ReentrantReadWriteLock中同步对象,是FairSync与NonfairSync中的一种,这也意味着ReentrantLock是“公平锁”或“非公平锁“中的一种,ReentrantLock默认是非公平锁只

深入浅析Java中锁的并发性