文档章节

身为JAVA工作者必须了解的实战知识(十三)

 叶荷
发布于 2017/08/30 19:30
字数 1206
阅读 26
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

一、状态依赖性的管理

有界缓存实现的基类

[java]view plaincopy

print?

@ ThreadSafe

publicabstractclassBaseBoundedBuffer {

@GuardeBy("this")privatefinalE[] buf;

@GuardeBy("this")privateinttail;

@GuardeBy("this")privateinthead;

@GuardeBy("this")privateintcount;

protectedBaseBoundedBuffer(intcapacity) {

this.buf = (E[])newObject[capacity];

}

protectedsynchronizedfinalvoiddoPut(E E) {

buf[tail] = E;

if(++tail == buf.length) {

tail =0;

}

++count;

}

protectedsynchronizedfinalE doTake() {

E E = buf[head];

buf[head] =null;

if(++head == buf.length) {

head =0;

}

--count;

returnE;

}

publicsynchronizedfinalbooleanisFull() {

returncount == buf.length;

}

publicsynchronizedfinalbooleanisEmpty() {

returncount ==0;

}

}

1 示例:将前提条件的失败传递给调用者

[java]view plaincopy

print?

@ ThreadSafe

publicclassGrumpyBoundedBufferextendsBaseBoundedBuffer {

publicGrumpyBoundedBuffer(intsize){

super(size);

}

publicsynchronizedvoidput(V v){

if(isFull()){

thrownewBufferFullException ();

}

doPut(v);

}

publicsynchronizedV take(){

if(isEmpty())

thrownewBufferEmptyExeption ();

returndoTake();

}

}

缓存为空或者已满都不是异常情况,使用者必须要捕获这些异常才能进行正确的处理。

[java]view plaincopy

print?

while(true){

try{

V item = buffer.take();

// 对于item执行一些操作

break;

}catch(BufferEmptyException e) {

Thread. sleep(SLEEP_GRANULARITY );

}

}

2 示例:通过轮询与休眠来实现简单的阻塞

从上面的代码可以看出,阻塞与出现异常都需要方法的使用者来处理,现在尝试都封装到有界缓存中。

[java]view plaincopy

print?

@ ThreadSafe

publicclassSleepyBoundedBufferextendsBaseBoundedBuffer {

publicSleepyBoundedBuffer(intsize) {

super(size);

}

publicvoidput(V v)throwsInterruptedException{

while(true){

synchronized(this){

if(!isFull()){

doPut(v);

return;

}

}

Thread.sleep(SLEEP_GRANULARITY);

}

}

publicV take()throwsInterruptedException{

while(true){

synchronized(this){

if(!isEmpty()){

returndoTake();

}

}

Thread.sleep(SLEEP_GRANULARITY);

}

}

}

3 条件队列

不需要使用while(true),改为使用wait、notifyAll

[java]view plaincopy

print?

@ ThreadSafe

publicclassBoundedBufferextendsBaseBoundedBuffer {

// 条件谓词:not-full (!isFull())

// 条件谓词:not-empty (!isEmpty())

publicBoundedBuffer(intsize) {

super(size);

}

// 阻塞并直道:not-full

publicsynchronizedvoidput(V v)throwsInterruptedException{

while(isFull()){

wait();

}

doPut(v);

notifyAll();

}

// 阻塞并直道:not-empty

publicsynchronizedV take()throwsInterruptedException{

while(isEmpty()){

wait();

}

V v = doTake();

notifyAll();

returnv;

}

}

二、使用条件队列

1 条件谓词

要想正确地使用条件队列,关键是找出对象在哪个条件谓词上等待。

2 过早唤醒

例如:内置条件队列中有多个条件谓语,此时如果调用notifyAll其含义是通知所有wait,但是并不一定所有条件谓语都满足执行条件。

当使用条件等待时(例如Object.wait或Condition.await):

. 通常都有一个条件谓词--包括一些对象状态的测试,线程在执行前必须首先通过这些测试。

. 在调用wait之前测试条件谓词,并且从wait中返回时再次进行测试。

. 在一个循环中调用wait。

. 确保使用与条件队列相关的锁来保护构成条件谓词的各个状态变量。

. 当调用wait、notify或notifyAll等方法时,一定要持有与条件队列相关的锁。

. 在检查条件谓词之后以及开始执行相应的操作之前,不要释放锁。

3 丢失的信号

已经满足通知的条件发出通知,但是之后才进入阻塞wait状态,所以wait永远等不到在其前面发出的notify。

4 通知

5 示例:阀门类

6 子类的安全问题

7 封装条件队列

8 入口协议与出口协议

三、显式的Condition对象

四、Synchronizer剖析

五、AbstractQueuedSynchronizer

六、java.util.concurrent同步器类中的 AQS

1 ReentrantLock

2 Semaphore与CountDownLatch

3 FutureTask

4 ReentrantReadWriteLock

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

粉丝 0
博文 24
码字总数 41519
作品 0
私信 提问
加载中
请先登录后再评论。
学习自动化测试须知

转载自本人公众号:自动化测试 在我写关于自动化测试的文章之前,以及读者在决定学习自动化测试之前,需要了解以下内容,并真正做好学习自动化测试的准备。 什么是自动化测试? 自动化测试是...

AllenLife
2018/05/29
0
0
Java程序员必读的经典书籍

身为Java程序员的你可能正在思考平时应该看一些什么书籍来提高自己的能力,那么今天我就给大家推荐一些我曾经看过的经典书籍。 1.《Java从入门到精通(第3版)》 这本书从Java初学者角度出发...

濡沫
2018/08/10
38
0
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
190
0
更多免费初级中级高级大数据java视频教程下载 加(微***信((号keepper,请备注java或扫下面2二3维4码23.第二十三阶段、Java大数据高并发系统架构实战方案课程吖

更多免费初级中级高级大数据java视频教程下载 加(微*信((号keepper,请备注java或扫下面2二3维4码23.第二十三阶段、Java大数据高并发系统架构实战方案课程吖 java视频教程01.第一讲大数据高并...

osc_yuku1blu
2018/12/19
1
0
京东资深架构带你深入理解JVM高级特性+最佳实践

【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 前言 Java是目前用户最多、使用范围最广的软件开发技术之一。Java 的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持...

白楠楠
03/06
17
0

没有更多内容

加载失败,请刷新页面

加载更多

18行Python代码抢京东神券

点击上方『早起Python』关注 回复送书参与赠书活动! 一、背景介绍 我们经常能看到京东上有满200减100之类的大额神券,但是当自己激动的等在电脑旁,手拿鼠标、眼盯屏幕,等着倒计时慢慢临近...

早起Python
05/31
10
0
关于SMP

欢迎关注公众号 VxWorks567。如转载,请标出处! 多核在嵌入式实时系统里应用的越来越多,而VxWorks从6.6开始支持多核,到6.8就算支持的不错了。风河提供了两种多核技术:Symmetric multipr...

taishan3721
2019/10/27
4
0
Unity安卓共享纹理

前置知识:安卓集成Unity开发示例 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 Unity 渲染 -> Unity做出更多的效果(滤...

osc_4b2ephd0
28分钟前
13
0
计算机网络中这些高频考题,你还在死记硬背吗?(一)

原文链接:原文来自个人公众号—C you again 对于IT从业者来说,计算机网络是一门必修课,也是一块硬骨头,不论是你是在工作中还是面试时,都需要掌握一些网络技术。从本期开始,小编对计算机...

osc_sb30h1xb
30分钟前
10
0
30岁+程序员职场攻略:找到自己的“职业锚”乘风破浪

摘要:何时都不算晚,只要你愿意开始!年龄,不应该是限制你未来可能性的理由。不要给自己贴标签,像姐姐们一样在事业场、生活场上乘风破浪! 都说三个女人一台戏,那30个年龄30+的女明星,聚...

华为云开发者社区
30分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部