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()方法,表示通知待召队列里面的所有线程。这些细节问题,并不对大局产生影响。
分享到:
相关推荐
12. **并发工具类**:`java.util.concurrent`包还包含了一些高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)和`CountDownLatch`(计数器门锁)等,用于构建复杂的并发应用。 13. **Lambda...
- **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **Future和ExecutorService**:用于异步计算和管理任务执行。 5. **线程池** - **Executor框架**:`ExecutorService`、`ThreadPoolExecutor`和`...
Java中的锁机制提供了多种锁类型,包括互斥锁、读写锁、信号量锁等。 MySQL数据库和SQL语句 MySQL是一个开源的关系数据库管理系统,提供了多种数据类型,包括整数、浮点数、字符串、日期等。SQL语句是用于操作...
10. **并发与多线程**:Java语言支持多线程编程,项目中可能涉及到并发控制,如锁、信号量等,以优化服务器性能。 11. **测试**:单元测试、集成测试是项目开发过程中的重要环节,JUnit和Mockito等工具可以帮助编写...
《多线程与高并发实战手册》可能详细介绍了如何在实际项目中应用这些理论。例如,可能会讨论如何在大型Web应用中设计和实现线程池,以有效地管理线程生命周期,减少线程创建和销毁的开销。线程池通过预先创建一定...
Activiti是一个基于Java的轻量级业务流程管理(BPM)平台,它遵循BPMN 2.0标准规范,用于设计、部署和管理业务流程。Activiti 5.16是该平台的一个版本,下面对用户手册中提及的知识点进行详细介绍。 1. 系统要求与...
- 实战指导:提供实际应用场景,展示如何设计和实施高效的业务流程。 - 故障排查:分享常见问题的解决策略,帮助用户快速定位并解决问题。 本手册通过目录导航,使得用户可以快速找到所需信息,无论是初学者还是...
9. **案例研究和最佳实践**:通过实际案例展示Flowable BPMN的应用,以及在设计和实施业务流程时的常见最佳实践。 10. **故障排查和优化**:分享一些常见问题的解决方法,以及如何优化Flowable的性能,确保流程的...
手册中会详细介绍如何使用 Activiti 的模型器工具设计流程图,包括拖放各个流程元素,设置属性,以及定义流程变量。同时,还会讲解如何导入和导出BPXN文件进行流程的保存和分享。 4. 部署流程: 部署流程涉及到将...
6. **内存管理与同步**:驱动程序需要处理复杂的内存管理和线程同步问题,手册会介绍如何正确地分配、释放内存,以及使用各种同步机制,如临界区、事件、信号量等。 7. **文件系统驱动**:对于涉及文件系统操作的...
3. **同步机制**:详细讲解了锁(包括可重入锁ReentrantLock)、条件变量、信号量、读写锁等同步机制的使用,以及死锁、活锁、饥饿等并发问题的预防和解决。 4. **并发设计模式**:介绍了一些经典的并发设计模式,...
在"AM1808技术手册"中,我们可以深入理解这款处理器的特性、功能以及如何在实际应用中进行系统设计。 一、AM1808处理器概述 AM1808是TI DaVinci系列的一部分,它集成了高性能的ARM926EJ-S CPU核心,支持32位指令集...
Activiti是基于Java的开源工作流引擎,广泛应用于企业的流程自动化和业务流程管理。手册深入浅出地介绍了如何利用Activiti来构建和优化业务流程。 一、 Activiti简介 Activiti是一款轻量级、高性能的工作流引擎,它...
总之,《JBoss jBPM jPDL用户开发手册1.1》是一份详细的学习指南,涵盖了jBPM和jPDL的使用方法和最佳实践,对于希望深入了解和使用jBPM进行业务流程管理的开发者来说,是一份宝贵的参考资料。通过阅读这本手册,你...
Activiti工作流用户手册是一份全面介绍Activiti的文档,旨在帮助用户理解和使用这个强大的工作流引擎。Activiti是一款开源的业务流程管理(BPM)和工作流系统,由Alfresco公司发起,并且在Apache 2.0许可证下发布。...
Activiti 是基于Java的BPMN 2.0规范实现,提供了一个轻量级、高性能的流程引擎。BPMN(Business Process Modeling Notation)是一种标准,用于图形化地表示业务流程。V5.21 版本继续增强了对BPMN的支持,使开发者...
- **应用场景**:事件驱动编程模型中的响应机制、用户界面交互设计。 **11. Activate 激活** - **定义**:使某项功能或状态变为活动状态。 - **应用场景**:激活软件许可证、激活硬件设备。 **12. Active 活动的**...
本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...