`
coach
  • 浏览: 386976 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

详细介绍Java信号量模型实际应用手册

阅读更多
 Java信号量模型需要我们不断的进行学习,在学习的时候会有不少的问题阻碍着我们。下面我们就来看看同步锁模型只是最简单的同步模型。同一时刻,只有一个线程能够运行同步代码。

  有的时候,我们希望处理更加复杂的同步模型,比如生产者/消费者模型、读写同步模型等。这种情况下,同步锁模型就不够用了。我们需要一个新的模型。这就是我们要讲述的Java信号量模型。

  Java信号量模型的工作方式如下:线程在运行的过程中,可以主动停下来,等待某个Java信号量模型的通知;这时候,该线程就进入到该信号量的待召(Waiting)队列当中;等到通知之后,再继续运行。

  很多语言里面,同步锁都由专门的对象表示,对象名通常叫Monitor。同样,在很多语言中,Java信号量模型通常也有专门的对象名来表示,比如,Mutex,Semphore。

  Java信号量模型要比同步锁模型复杂许多。一些系统中,信号量甚至可以跨进程进行同步。另外一些信号量甚至还有计数功能,能够控制同时运行的线程数。

  我们没有必要考虑那么复杂的模型。所有那些复杂的模型,都是最基本的模型衍生出来的。只要掌握了最基本的信号量模型——“等待/通知”模型,复杂模型也就迎刃而解了。

  我们还是以Java语言为例。Java语言里面的同步锁和Java信号量模型概念都非常模糊,没有专门的对象名词来表示同步锁和信号量,只有两个同步锁相关的关键字——volatile和synchronized。

  这种模糊虽然导致概念不清,但同时也避免了Monitor、Mutex、Semphore等名词带来的种种误解。我们不必执着于名词之争,可以专注于理解实际的运行原理。

  在Java语言里面,任何一个Object Reference都可以作为同步锁。同样的道理,任何一个Object Reference也可以作为Java信号量模型。

  Object对象的wait()方法就是等待通知,Object对象的notify()方法就是发出通知。

  具体调用方法为

  (1)等待某个Java信号量模型的通知

  public static final Object signal = new Object();

  … f1() {

  synchronized(singal) { // 首先我们要获取这个信号量。这个信号量同时也是一个同步锁

  // 只有成功获取了signal这个信号量兼同步锁之后,我们才可能进入这段代码

  signal.wait(); // 这里要放弃信号量。本线程要进入signal信号量的待召(Waiting)队列

  // 可怜。辛辛苦苦争取到手的Java信号量模型,就这么被放弃了

  // 等到通知之后,从待召(Waiting)队列转到就绪(Ready)队列里面

  // 转到了就绪队列中,离CPU核心近了一步,就有机会继续执行下面的代码了。

  // 仍然需要把signal同步锁竞争到手,才能够真正继续执行下面的代码。命苦啊。

  需要注意的是,上述代码中的signal.wait()的意思。signal.wait()很容易导致误解。signal.wait()的意思并不是说,signal开始wait,而是说,运行这段代码的当前线程开始wait这个signal对象,即进入signal对象的待召(Waiting)队列。

  (2)发出某个Java信号量模型的通知

  … f2() {

  synchronized(singal) { // 首先,我们同样要获取这个信号量。同时也是一个同步锁。

  // 只有成功获取了signal这个信号量兼同步锁之后,我们才可能进入这段代码

  signal.notify(); // 这里,我们通知signal的待召队列中的某个线程。

  // 如果某个线程等到了这个通知,那个线程就会转到就绪队列中

  // 但是本线程仍然继续拥有signal这个同步锁,本线程仍然继续执行

  // 嘿嘿,虽然本线程好心通知其他线程,

  // 但是,本线程可没有那么高风亮节,放弃到手的同步锁

  // 本线程继续执行下面的代码

  需要注意的是,signal.notify()的意思。signal.notify()并不是通知signal这个对象本身。而是通知正在等待signal信号量的其他线程。

  以上就是Object的wait()和notify()的基本用法。

  实际上,wait()还可以定义等待时间,当线程在某Java信号量模型的待召队列中,等到足够长的时间,就会等无可等,无需再等,自己就从待召队列转移到就绪队列中了。

  另外,还有一个notifyAll()方法,表示通知待召队列里面的所有线程。这些细节问题,并不对大局产生影响。
分享到:
评论

相关推荐

    javaAPI参考手册.rar

    12. **并发工具类**:`java.util.concurrent`包还包含了一些高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)和`CountDownLatch`(计数器门锁)等,用于构建复杂的并发应用。 13. **Lambda...

    《 Java开发手册(嵩山版)》.rar

    - **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **Future和ExecutorService**:用于异步计算和管理任务执行。 5. **线程池** - **Executor框架**:`ExecutorService`、`ThreadPoolExecutor`和`...

    2_中软卓越企业技术指导手册-Java方向详解版-3.6.pdf

    Java中的锁机制提供了多种锁类型,包括互斥锁、读写锁、信号量锁等。 MySQL数据库和SQL语句 MySQL是一个开源的关系数据库管理系统,提供了多种数据类型,包括整数、浮点数、字符串、日期等。SQL语句是用于操作...

    java京东项目

    10. **并发与多线程**:Java语言支持多线程编程,项目中可能涉及到并发控制,如锁、信号量等,以优化服务器性能。 11. **测试**:单元测试、集成测试是项目开发过程中的重要环节,JUnit和Mockito等工具可以帮助编写...

    多线程与高并发实战手册.rar

    《多线程与高并发实战手册》可能详细介绍了如何在实际项目中应用这些理论。例如,可能会讨论如何在大型Web应用中设计和实现线程池,以有效地管理线程生命周期,减少线程创建和销毁的开销。线程池通过预先创建一定...

    Activiti 5.16 用户手册.pdf

    Activiti是一个基于Java的轻量级业务流程管理(BPM)平台,它遵循BPMN 2.0标准规范,用于设计、部署和管理业务流程。Activiti 5.16是该平台的一个版本,下面对用户手册中提及的知识点进行详细介绍。 1. 系统要求与...

    Activiti 5_13 用户手册

    - 实战指导:提供实际应用场景,展示如何设计和实施高效的业务流程。 - 故障排查:分享常见问题的解决策略,帮助用户快速定位并解决问题。 本手册通过目录导航,使得用户可以快速找到所需信息,无论是初学者还是...

    Flowable BPMN 用户手册 (v 6.3.0).zip

    9. **案例研究和最佳实践**:通过实际案例展示Flowable BPMN的应用,以及在设计和实施业务流程时的常见最佳实践。 10. **故障排查和优化**:分享一些常见问题的解决方法,以及如何优化Flowable的性能,确保流程的...

    activiti5.21中文手册

    手册中会详细介绍如何使用 Activiti 的模型器工具设计流程图,包括拖放各个流程元素,设置属性,以及定义流程变量。同时,还会讲解如何导入和导出BPXN文件进行流程的保存和分享。 4. 部署流程: 部署流程涉及到将...

    中文ddk手册

    6. **内存管理与同步**:驱动程序需要处理复杂的内存管理和线程同步问题,手册会介绍如何正确地分配、释放内存,以及使用各种同步机制,如临界区、事件、信号量等。 7. **文件系统驱动**:对于涉及文件系统操作的...

    Addison.Wesley.Java.Concurrency.in.Practice.May.2006.pdf

    3. **同步机制**:详细讲解了锁(包括可重入锁ReentrantLock)、条件变量、信号量、读写锁等同步机制的使用,以及死锁、活锁、饥饿等并发问题的预防和解决。 4. **并发设计模式**:介绍了一些经典的并发设计模式,...

    AM1808技术手册

    在"AM1808技术手册"中,我们可以深入理解这款处理器的特性、功能以及如何在实际应用中进行系统设计。 一、AM1808处理器概述 AM1808是TI DaVinci系列的一部分,它集成了高性能的ARM926EJ-S CPU核心,支持32位指令集...

    activiti5用户手册

    Activiti是基于Java的开源工作流引擎,广泛应用于企业的流程自动化和业务流程管理。手册深入浅出地介绍了如何利用Activiti来构建和优化业务流程。 一、 Activiti简介 Activiti是一款轻量级、高性能的工作流引擎,它...

    JBoss jBPM jPDL用户开发手册1.1

    总之,《JBoss jBPM jPDL用户开发手册1.1》是一份详细的学习指南,涵盖了jBPM和jPDL的使用方法和最佳实践,对于希望深入了解和使用jBPM进行业务流程管理的开发者来说,是一份宝贵的参考资料。通过阅读这本手册,你...

    Activiti工作流用户手册

    Activiti工作流用户手册是一份全面介绍Activiti的文档,旨在帮助用户理解和使用这个强大的工作流引擎。Activiti是一款开源的业务流程管理(BPM)和工作流系统,由Alfresco公司发起,并且在Apache 2.0许可证下发布。...

    Activiti V5.21 用户手册 中文版_Activiti5.21介绍_activiti5.21_ActivitiV5.1

    Activiti 是基于Java的BPMN 2.0规范实现,提供了一个轻量级、高性能的流程引擎。BPMN(Business Process Modeling Notation)是一种标准,用于图形化地表示业务流程。V5.21 版本继续增强了对BPMN的支持,使开发者...

    程序员英语手册

    - **应用场景**:事件驱动编程模型中的响应机制、用户界面交互设计。 **11. Activate 激活** - **定义**:使某项功能或状态变为活动状态。 - **应用场景**:激活软件许可证、激活硬件设备。 **12. Active 活动的**...

    Java并发编程实战

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...

Global site tag (gtag.js) - Google Analytics