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

一、状态依赖性的管理

有界缓存实现的基类

[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程序员的道路上,我们可以一起学习、一起进步

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

推荐阅读更多精彩内容