Condition

  • Condition接口描述了可能会与锁有关联的条件变量。这些变量在用法与使用Object.wait访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个Lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的Object版本中的不同;
  • 在Condition对象中,与wait、notify和notifyAll方法对应的分别是await、signal和signalAll;
  • Condition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例,请使用器newCondition()方法。

面试题

 package com.ccfdod.juc;

 import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
* 如:ABCABCABC……
*/
class AlternateDemo {
//标志当前由哪一个线程输出,1代表A,2代表B,3代表C
private int number = 1; Lock lock = new ReentrantLock(); //Condition的强大之处在于它可以为多个线程间建立不同的Condition
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition(); // loopNum:当前循环轮数
public void loopA(int loopNum) {
//上锁
lock.lock();
try {
while (number != 1) {
//等待
condition1.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 2;
//唤醒
condition2.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
//确保释放锁
lock.unlock();
}
} public void loopB(int loopNum) {
lock.lock();
try {
while (number != 2) {
condition2.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 3;
condition3.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} public void loopC(int loopNum) {
lock.lock();
try {
while (number != 3) {
condition3.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 1;
condition1.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
} public class TestABCAlternate { public static void main(String[] args) {
AlternateDemo ad = new AlternateDemo(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopA(i);
}
}, "A").start(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopB(i);
}
}, "B").start(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopC(i);
}
}, "C").start();
}
}

最新文章

  1. 使用C#处理基于比特流的数据
  2. Oracle数据库的链接数目超标
  3. AES加密解密通用版Object-C / C# / JAVA
  4. python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
  5. JQ nextALL() 实现遍历
  6. html-制作导航菜单
  7. web关键词搜索高亮代码
  8. 545C. Woodcutters
  9. 安装node和grunt
  10. verilogHDL设计中的同步时序逻辑
  11. 【转载】linux strace
  12. 蚂蚁爬杆问题 UVA 10881
  13. JVM学习记录-垃圾回收算法
  14. P5304 [GXOI/GZOI2019]旅行者
  15. XCopy 小技巧
  16. 《xxx系统》质量属性战术
  17. Confluence 6 空间权限和链接到相关的空间
  18. 学习-HTML5
  19. java初学网站
  20. 浙大月赛ZOJ Monthly, August 2014

热门文章

  1. Tomcat内部结构及请求原理(转)
  2. [C#]浮点数除零无法捕获异常的解决办法
  3. Salesforce视图与控制器之间的交互
  4. [2010-12-28 20:39]ActionScript3.0中用要的公式
  5. C++之MFC基本设置
  6. 优秀 H5 案例收集 vol.4(不定期更新)
  7. android - Session &#39;app&#39;: Error Installing APK
  8. 20145329《Java程序设计》第六周学习总结
  9. 动态 K th
  10. tomcat监控,自动重启shell脚本