Java之JUC系列(02)--锁机制

根据JDK版本的更新,Java中的锁机制,主要分为同步锁(synchronized)和java并发工具包中的锁 。

一、同步锁(synchronized)

同步锁(synchronized)用于解决共享资源竞争的问题,通过添加synchronized实现对象资源使用的同步,从JDK1.0开始就使用该关键字了。
同步锁的基本原理:每一个对象,有且仅有一个同步锁,多个线程能共同访问该同步锁,但是,在同一个时间点,该同步锁只能被一个线程获取到,此时,获取到同步锁的进程就执行,而没有获取到该同步锁的线程,就进行等待,直到获取到该对象的同步锁,才能够运行。

二、JUC(Java并发包)中的锁

相对于同步锁,JUC工具包中的锁功能更加强大,它为锁提供了一个框架,该框架允许更灵活的使用锁,只是在用法上不同而已。
JUC工具包中的锁:
Lock接口,ReadWritelock接口,LockSupport阻塞原语,Condition条件,AbstractOwnablesSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类,ReentrantLock独占锁,ReentrantReadWriteLock读写锁,由于CountDownLatch,CyclicBarrier和Semaphore也是通过抽象队列同步类AQS实现的,因此也归纳到一起进行介绍。
image

(1)Lock接口
JUC工具包中的Lock接口支持公平锁、非公平锁、重入锁等不同规则的锁规则。“公平锁”是指不同的线程获取锁的机制是公平的,而“非公平锁”是指不同的线程获取锁的机制是不公平的,“可重入锁”是指同一个锁能被一个线程多次获取。
(2)ReadWriteLock(读写锁)
ReadWriteLock接口和Lock接口类似的定义了一些读取者可以共享而写入者独占的锁。JUC包只有ReentranReadWriteLock类实现了该接口。
(3)AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类
AbstractQueuedSynchronizer被称为AQS的类,它是一个非常有用的超类,可用来定义锁以及依赖于排队阻塞线程的其它同步器;ReentrantLock、ReentrantReadWriteLock、CountDownLatch、CyclicBarrier和Semaphore等这些类都是基于AQS类实现的。AbstractQueuedLongSynchronizer类提供相同的功能但扩展了对同步状态的64位的支持。两者都扩展了 AbstractOwnableSynchronizer。
(4)LockSupport
LockSupport提供“创建锁”和其它同步类的基本线程阻塞原语。
LockSupport的功能和Thread中的Thread.suspend()和Thread.resume()相似。LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。但是park()和unpark()不会遇到Thread.suspend和Thread.resume所可能引发的死锁问题。
(5)Condition
Condition需要和Lock联合使用,它的作用是代替object监视器方法,可以通过await()、signal()来休眠和唤醒线程。
Condition接口描述了可能会与锁有关联的条件变量,这些变量在用法上与使用wait()访问的隐式监视器类似,但提供了更强大的功能。单个的Lock可能与多个Condition对象相关联。注意Condition方法的名称和object方法中的不同。
(6)ReentrantLock
ReentrantLock是独占锁,是指只能被独自占领,同一个时间点只能被一个线程获取到的锁。ReentrantReadWriteLocktrantLock锁包括公平的和非公平的ReentrantLock。公平的ReentrantLock是指不同线程获取锁的机制是公平的,而非公平的ReentrantLock是指不同的线程获取锁的机制是非公平的。ReentrantLock是可重入的锁。
1>ReentrantLock实现了Lock接口;
2>ReentrantLock有一个成员变量sync,是Sync类型,它是一个抽象类,而且继承于AQS;
3>ReentrantLock中有公平锁FairSync和非公平锁NonfairSync,它们都是Sync的子类。ReentrantLock中的sync对象,是FairSync于NonfairSync中的一种,也就意味着ReentrantLock是公平锁或非公平锁中的一种,ReentrantLock默认是非公平锁。
(7)ReentrantReadWriteLock
ReentrantReadWriteLock是读写锁接口的ReadWritelock的实现类,它包括子类ReadLock和WriteLock。ReadLock是共享锁,而WriteLock是独占锁。
1>ReentrantReadWriteLock实现了ReadWriteLock接口;
2>ReentrantReadWriteLock中包含sync对象,读锁ReadLock和写锁都实现了Lock接口。
3>和ReentrantLock一样,sync是Sync类型,而且,Sync也是一个继承于AQS的抽象类,Sync也包括”公平锁”FairSync和”非公平锁”NonfairSync。
(8)CountDownLatch
CountDownLatch是一个同步辅助类,在完成一组正在怒其它线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch包含了sync对象,sync是Sync类型。CountDownLatch的Sync是实例类,继承于AQS。
(9)CyclicBarrier
CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。因为该barrier在释放等待线程后可以重用,所以称为循环的barrier。
CyclicBarrier是包含了”ReentrantLock对象lock”和”Condition对象trip”,它是通过==独占锁==实现的。
CyclicBarrier和CountDownLatch的区别是:
1> CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
2>CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
(10)Semaphore
Semaphore是一个计数信号量,它的本质是一个共享锁。
信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
和”ReentrantLock”一样,Semaphore包含了sync对象,sync是Sync类型;而且,Sync也是一个继承于AQS的抽象类。Sync也包括”公平信号量”FairSync和”非公平信号量”NonfairSync。

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值