jdk 官网对Condition的描述:
Condition 将 Object 监视器方法(wait
、notify
和 notifyAll
)分解成截然不同的对象,以便通过将这些对象与任意 Lock
实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
下面通过网上一道面试题看看Condition的应用:
启动三个线程,顺序打印ABC十次
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintABC {
Lock lock = new ReentrantLock();
Condition aCdt = lock.newCondition();
Condition bCdt = lock.newCondition();
Condition cCdt = lock.newCondition();
int order = 0;
public static void main(String[] args) {
final PrintABC print = new PrintABC();
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
print.printA();
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
print.printB();
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
print.printC();
}
});
}
executorService.shutdown();
}
public void printA() {
try {
lock.lock();
while (order != 0) {
aCdt.await();
}
System.out.println("A");
order = 1;
bCdt.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB() {
try {
lock.lock();
while (order != 1)
bCdt.await();
System.out.println("B");
order = 2;
cCdt.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC() {
try {
lock.lock();
while (order != 2)
cCdt.await();
System.out.println("C");
order = 0;
aCdt.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
分享到:
相关推荐
线程并发控制condition 互斥量 多线程写的:生产者、消费者问题
多线程同步解决卖票问题
多线程情况下最常见的问题之一:数据共享; 当多个线程都要去修改某一个共享数据的时候,需要对数据访问进行同步; 条件同步:threading.Condition 部分代码 import threading class Producer(threading...
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
多线程注意:wait()方法的调用要有判定条件常用 while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的...
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
这是陈硕在 2009 年上海 C++ 技术大会演讲...如何避免这种 race condition 是 C++ 多线程编程面临的基本问题,可以借助 tr1 中的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程安全的 Observer 模式的必备技术。
本文实例讲述了python多线程高级锁condition简单用法。分享给大家供大家参考,具体如下: 多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程...
"生产者-消费者的Linux多线程实现" 生产者-消费者问题简介 生产者-消费者问题是经典的进程同步互斥问题。本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高...
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
多线程情况下最常见的问题之一:数据共享; 当多个线程都要去修改某一个共享数据的时候,需要对数据访问进行同步; 锁:threading.Rlock 条件同步:threading.Condition 队列:Queue 首先一个...
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...
本文将从 Lock 和 Condition 接口开始,讲解多线程编程的核心思想。 一、Lock 接口 Lock 接口是 Java 并发包中的一个核心接口,提供了同步机制,用于多线程环境下的线程安全。Lock 接口中的方法有 lock()、...
Condition是java.util.concurrent.locks包下的类,提供了对线程锁的更精细的控制方法,下面我们就来看一下Java多线程编程中使用Condition类操作锁的方法详解
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...
java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.