package com.ixhong.base.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreeConditionCommunication {
/**
* @param args
*/
public static void main(String[] args) {
final Business business = new Business();
new Thread(
new Runnable() {
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub2(i);
}
}
}
).start();
new Thread(
new Runnable() {
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub3(i);
}
}
}
).start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
static class Business {
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
private int shouldSub = 1;
public void sub2(int i){
lock.lock();
try{
while(shouldSub != 2){
try {
condition2.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
}
shouldSub = 3;
condition3.signal();
}finally{
lock.unlock();
}
}
public void sub3(int i){
lock.lock();
try{
while(shouldSub != 3){
try {
condition3.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=20;j++){
System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
}
shouldSub = 1;
condition1.signal();
}finally{
lock.unlock();
}
}
public void main(int i){
lock.lock();
try{
while(shouldSub != 1){
try {
condition1.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
shouldSub = 2;
condition2.signal();
}finally{
lock.unlock();
}
}
}
}
分享到:
相关推荐
本文将深入探讨JavaLock中的ReentrantLock(可重入锁)以及与其紧密相关的Condition接口,帮助你理解它们的工作原理和应用场景。 **一、ReentrantLock可重入锁** ReentrantLock是Java.util.concurrent.locks包下的...
在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...
Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...
C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。 std::mutex 先来看下std::mutex: 包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛...
在这个示例中,使用了Java的`java.util.concurrent.locks`包中的`Lock`接口和`Condition`接口来实现这一模式。`Lock`接口提供了比`synchronized`更精细的锁控制,而`Condition`接口则允许我们创建特定条件的等待队列...
5. **锁绑定条件**:`Lock`提供了`Condition`接口,可以创建多个条件变量,每个条件对应一个等待队列,而`synchronized`只有一个等待队列。 6. **公平性**:`ReentrantLock`可以通过构造函数选择公平锁或非公平锁,...
它通常与互斥锁(Mutex)和锁_guard(Lock_Guard)一起使用,以实现线程安全的数据共享。 Condition_Variable 的主要成员函数 Condition_Variable 提供了多种成员函数来实现线程同步,包括: * wait():等待条件...
`lock`语句是C#中用于实现线程同步的重要工具,主要是为了解决多个线程并发访问共享资源时可能出现的竞争条件(race condition)问题。在描述的场景中,`lock`关键字被用来确保在同一时间只有一个线程可以访问特定的...
在多线程环境中,多个线程可能同时尝试修改同一份数据,如果不加以控制,可能会导致数据不一致或者竞争条件(race condition)。`lock`语句通过获取一个对象的锁,阻止其他线程在同一时间对该对象进行访问,从而确保...
- **newCondition()**:创建一个新的`Condition`对象,用于实现更复杂的锁等待条件。 #### 六、ReentrantLock `ReentrantLock`是`Lock`接口的一个实现,提供了可重入锁的功能,即同一线程可以多次获取同一个锁。...
### 解决ArcSDE版本lock问题 #### 一、引言 在GIS(地理信息系统)领域,ArcSDE 是一种广泛使用的空间数据库引擎,它能够有效地管理大量的空间数据。然而,在实际操作过程中,用户可能会遇到...
此外,`Lock`接口还支持更复杂的并发控制策略,如可中断的锁等待(`tryLock()`方法),以及通过`Condition`对象实现线程间的条件等待和精确唤醒。 在实际应用中,`ReentrantLock`是`Lock`接口最常见的实现,它具有...
Condition对象可以通过Lock对象的newCondition()方法创建,每个Lock对象可以创建多个Condition对象。Condition对象提供了await()、signal()、signalAll()等方法,用于控制线程的等待和唤醒。 Condition的使用: *...
【线程管理模块升级】 在操作系统的设计和实现中,线程管理是核心组成部分之一,它涉及到线程的创建、销毁、调度以及同步互斥等问题。Nachos是一个开源的类UNIX操作系统,提供了一个教学和研究操作系统的平台。...
本示例中,我们使用了Lock和Condition来实现生产者消费者模型,避免了使用synchronized关键字的方式,而是使用了Lock和Condition来实现线程同步和通信,提高了程序的性能和可读性。 知识点: * Java中的生产者消费...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
private static Condition condition = lock.newCondition(); public static void main(String[] args) { ThreadA ta = new ThreadA(condition); ta.start(); lock.lock(); try { System.out.println(Thread...
条件变量(Condition)是Lock的一个扩展,它允许线程等待特定条件满足后再继续执行。每个Lock对象可以有多个条件变量。例如,Condition接口提供了以下方法: 1. await():使当前线程进入等待状态,直到被信号...
《Lock详解——深入理解Java并发编程的基石》 在Java并发编程中,Lock接口及其实现是不可或缺的一部分。本文将深入探讨Lock接口的核心实现——ReentrantLock,以及它背后的抽象队列同步器...