第十四章 构建自定义的同步工具

14.1 状态依赖性管理

   基于先检查后执行的状态依赖性操作在多线程下常常发生一些我们不希望的结果.因此有必要对状态依赖操作进行管理,

  1. 构成前提条件的状态变量必须有对象的锁来保护,从而使他们在测试前提条件的同事保持不变.
  2. 如果条件尚未满足, 则必须释放锁.
  3. 下次测试前提条件之前则必须重新获取锁.之后再进行前提条件的测试

  重试的实现方式 :

  • 自旋等待. 在条件不成立时一直询问, 直到条件成立. 会消耗大量的CPU时间
  • 休眠. 如果条件不成立, 则休眠一段时间, 休眠过后继续测试条件是否成立. 响应性较低
  • Thread.yield()  在条件不成立时,让其他线程优先执行

14.2 条件队列

  使得一组线程能够通过某种方式来等待特定条件变为真.队列中的元素为线程.

  每个Java对象都可以作为一个锁, 每个锁都可以拥有一个条件队列. 内置锁的条件队列是非公平的.

  Object.wait()  挂起当前线程. 并自动释放锁,

  Thread.sleep() 挂起当前线程, 不会释放锁

14.2.1 条件谓词

  条件谓词是某个状态依赖操作的前提条件.

  条件等待的三元关系 : 加锁, 线程挂起, 条件谓词

  条件谓词包含的状态变量必须由同一个锁来保护, 测试条件之前必须先持有这个锁, 锁对象和条件队列对象必须是同一个对象.

  使用条件等待:

  1. 至少有一个条件谓词
  2. 在一个循环中调用wait()
  3. 在wait()返回后再次测试条件谓词是否成立

14.2.2 通知与唤醒

  仅在满足一下两种情况事才可以使用 notify()

  1. 单进单出. 条件变量的每次通知最多只能唤醒一个线程执行.否则会导致信号的丢失,使得某个线程等待一个发生过的信号
  2. 所有等待线程的类型都相同. 每个线程在wait()返回后执行相同的操作.且只有一个条件谓词与条件队列相关.

  notify()比notifyall() 更高效,但是也更加危险

  通过减少比必要的通知次数可以优化通知的性能.

14.3 显式的 Condition 对象

  同一个条件队列上等待不同条件谓词的情况

原文地址:https://www.cnblogs.com/virgosnail/p/9446524.html

时间: 2024-10-11 10:10:03

第十四章 构建自定义的同步工具的相关文章

《Java并发编程实战》第十四章 构建自己的同步工具定义 札记

一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( "this" ) private final E[] buf; @GuardeBy( "this" ) private int tail; @GuardeBy( "this" ) private int head; @GuardeBy( "this

第十四章:构建自定义的同步工具——Java并发编程实战

一.状态依赖性管理 对于单线程程序,某个条件为假,那么这个条件将永远无法成真 在并发程序中,基于状态的条件可能会由于其他线程的操作而改变 1 acquire lock on object state 2 while (precondition does not hold) 3 { 4 release lock 5 wait until precondition might hold 6 optionally fail if interrupted or timeout expires 7 rea

java并发编程10.构建自定义的同步工具

创建状态依赖类的最简单方法通常是在类库中现有状态依赖类的基础上进行构造.如果类库中没有提供你需要的功能,可以使用java语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列.显示地Condition对象以及AbstractQueuedSynchronizer框架. 在单线程程序中调用方法时,如果基于某个状态的前提条件未得到满足,那么这个条件永远无法成真.而在并发程序中,基于状态的条件可能会由于其他线程的操作而改变. 可阻塞的状态依赖操作 acquire lock on object

Python 3标准库 第十四章 应用构建模块

Python 3标准库 The Python3 Standard Library by  Example -----------------------------------------第十四章     应用构建模块-----------------------------14.1  argparse:命令行选项和参数解析----------------------------- argparse模块 14.1.1  建立解析器 14.1.2  定义参数 argparse模块 14.1.3 

Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41006627 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以

第十四章 DNS系统

一.DNS系统的作用及类型DNS 系统的作用正向解析:根据主机名称(域名)查找对应的 IP 地址反向解析:根据 IP 地址查找对应的主机域名DNS 系统的分布式数据结构? 缓存域名服务器– 也称为高速缓存服务器– 通过向其他域名服务器查询获得域名 -> IP 地址记录– 将域名查询结果缓存到本地,提高重复查询时的速度? 主域名服务器– 特定 DNS 区域的官方服务器,具有唯一性– 负责维护该区域内所有域名 -> IP 地址的映射记录? 从域名服务器– 也称为 辅助域名服务器– 其维护的 域名