线程的协作机制

115 阅读1分钟

总结自Java编程的逻辑

         下图来自Java编程的逻辑. 章节15.3.2

wait/notify协作:

两个线程通过一个volatile变量来进行协作。

线程A:

在一个对象的run方法内,可以对共享volatile变量的值进行判断,如果共享volatile变量的值为0或者false,那么就会调用wait()方法,当前线程等待。

wait()方法会将当前线程放置在当前锁的条件队列上,然后让出之前获取的锁。

线程B:

notify方法会被放置在一个synchronized方法内。另一个线程B进入当前类后,会先获取到锁,设置共享变量的值,然后调用notify()唤醒当前锁的条件队列中等待线程,然后B会继续执行,直到synchronized方法内的代码被执行完毕后,才会给出锁。

线程A:

线程A被唤醒,去获取锁,获取到之后,会从wait()调用中返回。 如果没有获取到,会被再次加入到锁的条件阻塞队列中,直到下次获取到锁,才能从wait()调用中返回。

从wait()调用中返回后,会再次判断条件,如果共享的volatile变量还是false,那么会再次wait(), 让出锁,被加入到条件队列。

如果判断共享volatile变量为true, 那么就会执行下边的代码。