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()方法,表示通知待召队列里面的所有线程。这些细节问题,并不对大局产生影响。
分享到:
相关推荐
在进行多线程编程时,经常要使用同步互斥机构,但Java本身没有提供的同步互斥机构,仅提供了两个与同步互斥有关的方法:wait()和notify(),可以用来设计信号量类:mySemaphore,它是按照Dijkstra提出的计数信号量的...
Java进程信号量机制的实验程序,java中重要的信号量机制
Java 信号量编程实践
介绍互斥与信号量的差别,用于实现同步异步操作
实验五-信号量的实现和应用,一、问题回答 1.在 pc.c 中去掉所有与信号量有关的代码,再运行程序,执行效果有变化吗?为什么会这样? 答:在去掉与信号量有关的代码后,执行结果Customer的消费数据没有按递增的...
哈工大软件学院操作系统实验4——信号量的实现和应用。这个实验有点难,尤其是sem.c的编写。文件中包含要上交的代码文件。
2.1 进程的基本概念 2.2 进程控制 2.3 进程同步 2.4 经典进程的同步问题 2.5 进程通信 2.3.1 进程同步的基本概念 2.3.2 信号量机制 2.3.3 信号量的应用
信号量与PV操作PPT,详细介绍操作系统中,信号量与PV操作的关系
哈工大的操作系统实验四,今年老师要求制作PPT,于是良心制作,详细记录了系统调用的相关操作及实验结论,希望对有心人有用,大家共同进步
java编写的哲学家就餐问题的解决方案,有图形界面,我是重庆大学的。如果你也是重庆大学的,那就请毫不犹豫的下载吧,肯定是你需要的代码,信号量
电子-深入理解和实现RTOS连载9信号量应用演示.pdf,操作系统/图形界面其他RTOS
关于线程同步 synchronize,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。
主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
仓库管理问题,Linux0.11 信号量的实现与应用。
无线信号传播模型.无线信号传播模型.无线信号传播模型.
本文以多核DSP芯片TMS320C6678为例,描述了硬件信号量的工作原理和方法以及模块的结构和配置,并给出两个核之间通信的实例。
基于Qt信号量实现的单生产者多消费者模式下的消息队列,可在多线程应用中对不同的消息结构体进行数据传输。
java同步互斥信号量问题 多线程的创建同步互斥函数P(),V()
操作系统中经典的互斥信号量机制的应用--生产者、消费者
ucos 信号量集详细介绍