Java J.U.C中的 AQS 组件

AbstractQueuedSynchronizer - AQS jdk1.5

JUC的重中之重,实现原理:

1、提供了基于:First in First Out 队列  Queue 
2、底层是双向列表 队列

设计:
1)使用Node实现FIFO队列,可以用于构建或者其他同步装置的基础框架。
2)利用了一个int类型表示状态
3)使用方法是继承
4)子类通过继承并通过实现它的方法管理其状态 acquire 和 release
5)可以同时实现排它锁和共享锁(独占、共享)

AQS 组件:

CountDownLatch  通过计数器控制线程是否阻塞
Semaphore   控制同一时间并发的数量
ReentrantLock  锁(阻塞进程)
Condition  条件 
FutureTask  

CountDownLatch 闭锁

Semaphore 信号量

CyclicBarrier Cyclic(循环) Barrier(屏障)

应用场景: 
多线程计算数据,然后等线程都计算完成之后进行合并操作。

CyclicBarrier 与 CountDownLatch 区别?相同点和不相同点

相同点:
1、都是通过计数器进行实现
2、都是调用await方法之后进度等待状态

不相同点:
1、CountDownLatch 计数器只能使用一次 ,CyclicBarrier.reset()进行重置可以循环使用
2、CountDownLatch 主要是一个线程或者多个线程需要等待其他线程操作完成之后才能继续往下执行。
   CyclicBarrier  主要是指多个线程相互等待,直到都满足条件之后继续往下执行。各个线程内部相互等待的过程。   
3、CyclicBarrier 能处理更加复杂场景

barrier.getNumberWaiting();  获得阻塞线程的数量 
barrier.isBroken(); 阻塞的线程是否被中断了
barrier.getParties(); 
barrier.await();
barrier.await(2000, TimeUnit.MILLISECONDS);
barrier.reset() 

ReentrantLock 与 锁

ReentrantLock (可重入锁) 和 synchronized 区别?

可重入性:
    一个线程进入一次,锁的计数器就自增一。所以等到锁的计数器下降为0时,释放锁。
    
锁的实现:
    1、ReentrantLock 是jdk 实现,用代码可以控制
    2、synchronized 是jvm实现,是java虚拟机实现 
性能:
    目前性能差不多
    synchronized 使用比较简单,所以官方推荐
功能区别:
   1、ReentrantLock 有可能造成死锁(忘记 最好在finally方法中解锁)
   2、锁的细粒度和灵活性     ReentrantLock 相对较高一些
    
ReentrantLock 独有功能?

1、公平锁和非公平锁?
公平锁:先等待的锁先获得锁执行。
2、提供了Condition类,可以分组唤醒需要唤醒的线程
3、提供了能够中断等待锁的线程机制,lock.lockInterruptibly()

 ReentrantLock 是一种自解锁,通过循环调用CAS操作来实现加锁。
性能比较好的原因是避免线程进入内核态的阻塞状态。

ReentrantLock 这么好,是不是以后就不需要用到synchronized了呢?
1、ReentrantLock 高级用户的高级特性,同步已经成为可伸缩性的瓶颈的时候。
2、synchronized 不会忘记释放锁,jvm自动做。否则工作块出现死锁
3、当jvm使用synchronized 管理锁定请求和释放时,jvm在生成线程转储时,能包括锁定信息,对调试有价值。
能包含死锁和其他异常的来源。
4、同事熟悉synchronized 、大部分场景用synchronized可以解决

ReentrantLock 主要的方法?

tryLock() 仅在调用锁定时,未被另一个线程保持的情况下,获取锁定。
tryLock(long ,TimeUnit)  如果锁定在给定的时间内没有被另一个线程保持,且当前线程没有中断,则获取这个锁定
lockInterruptibly() 如果当前线程没有被中断的话,则获取锁定,如果被中断了,则抛出异常
isLocked()  查询此锁定是否由任意线程保持
isHeldByCurrentThread() 当前线程是否保持锁定状态
isFair()判断是否为公平锁

hasQueuedThread(Thread ) 查询指定线程是否在等待获取此锁定
hasQueuedThreads() 查询是否有线程在等待获取此锁定
getHoldCount() 查询当前线程保持锁定的个数,也就是调用了lock()方法的个数

ReentranReadWriteLock

在没有任何读写锁的时候才可以取得写入锁。
用于实现悲观读取,我们在执行中进行读取时同时需要执行写入操作。
如果读取非常多,那么有可能造成获得写入锁造成饥饿(写入线程迟迟无法竞争到线程而处于等待状态)

StampedLock

三种状态: 写 、读 、乐观读
重点乐观读:
如果读的操作很多,写的操作很少,我们可以乐观的认为读取和写入同时发生的机率很小,因此并不完全悲观的使用
程序可以查看读取资料之后,是否遭到写入执行的变更,在采取后续的措施。

关于锁的总结

1、synchronized 是jvm层面的实现的,不但通过一些监控工具监控,而且在代码执行时出现异常,jvm也会自动释放锁定。
jvm会自动实现加锁与解锁。
2、ReentrantLock 、 ReentranReadWriteLock 、StampedLock 等等都是对象层面的锁定。必须要保证锁一定会释放( unlock操作必须放到finally里边,才更安全)
3、StampedLock 对吞吐量有巨大改进,特别是在读线程越来越多的场景下。

关于锁的选择?

1、当之后少量竞争者的时候 synchronized 是非常好的选择。
2、竞争者不少,但是线程增长的曲线是可以预估的,这个是时候ReentrantLock最好的选择
3、避免造成死锁

Condition 组件

多线程之间协调通讯的工具。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容