/** * 3个线程,依次执行 * @author timeriver.wang * @date 2014-03-10 2:06:19 PM */ public class ThreeThreadCommunication { public static void main( String[] args ) { final Bunnies bunnies = new Bunnies(); new Thread( new Runnable() { public void run() { for ( int i = 0; i < 4; i++ ) { bunnies.sub2( i ); } } } ).start(); new Thread( new Runnable() { public void run() { for ( int i = 0; i < 4; i++ ) { bunnies.sub3( i ); } } } ).start(); // main方法本身就是主线程 for ( int i = 0; i < 4; i++ ) { bunnies.main( i ); } } static class Bunnies { Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); // 对flag共享数据,已经加锁保护了 private int flag = 1; public void sub2( int i ) { lock.lock(); try { while ( flag != 2 ) { try { condition2.await(); } catch ( InterruptedException e ) { e.printStackTrace(); } } for ( int j = 0; j < 4; j++ ) { System.out.println( Thread.currentThread() + "sequence : " + j + " loop of : " + i ); } flag = 3; condition3.signal(); } finally { lock.unlock(); } } public void sub3( int i ) { lock.lock(); try { while ( flag != 3 ) { try { condition3.await(); } catch ( InterruptedException e ) { e.printStackTrace(); } } for ( int j = 0; j < 4; j++ ) { System.out.println( Thread.currentThread() + "sequence : " + j + " loop of : " + i ); } flag = 1; condition1.signal(); } finally { lock.unlock(); } } public void main( int i ) { lock.lock(); try { while ( flag != 1 ) { try { condition1.await(); } catch ( InterruptedException e ) { e.printStackTrace(); } } for ( int j = 0; j < 4; j++ ) { System.out.println( Thread.currentThread() + "sequence : " + j + " loop of : " + i ); } flag = 2; condition2.signal(); } finally { lock.unlock(); } } } }
相关推荐
- **Condition**:`ReentrantLock`支持多个条件变量,每个`Condition`对象都有自己的等待队列,可以实现更细粒度的同步控制。与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal...
- 分离锁和条件:`ReentrantLock`有`Condition`接口,可以创建多个条件,每个条件对应一个等待队列,提高了线程间的协作能力。 4. **灵活性**: - 更好的控制粒度,可以只锁定需要的部分代码,提高并发效率。 - ...
Java中的ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个高级锁,它是可重入的,意味着一个线程可以多次获取同一锁。在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java...
`ReentrantLock`和`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的两个重要工具,它们提供了比标准`synchronized`关键字更高级别的锁控制机制。本文将深入探讨这两个类,以及如何通过配置...
- Condition是ReentrantLock的重要补充,可以创建多个Condition对象,每个Condition对应一个等待队列。线程调用`await()`方法会释放锁并进入对应的等待队列,等待被`signal()`或`signalAll()`唤醒。Condition的等待...
在上面的代码中,我们创建了一个ReentrantLock和一个Condition,然后我们启动了一个线程,该线程会等待条件成立,而另一个线程则会通知条件已成立。 Condition的await()方法 ------------------------- Condition...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升软件的效率和响应...在实际项目中,结合Java的开源库,如`java-multi-thread-programming-master`,可以进一步提升我们的多线程编程能力。
"thread-multi.zip"这个压缩包文件显然包含了一个与Java多线程相关的项目,它可能是一个示例工程,帮助开发者理解如何利用多线程来查询批量数据。下面我们将详细探讨Java多线程的相关知识点以及在批量数据查询中的...
- `hasQueuedThread(Thread thread)`:检查指定的线程是否正在等待获取锁。 5. **尝试获取锁**: `tryLock()`方法允许线程尝试获取锁,如果立即成功则返回`true`,否则返回`false`。还有一个可接受超时参数的版本...
带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...
用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620
- `Lock` 接口及实现:如 `ReentrantLock` 提供可中断、公平锁等高级特性。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 - `CyclicBarrier` 和 `CountDownLatch`:协调多个线程间的同步。 3. **...
Java提供了多种同步机制,如`synchronized`关键字、`java.util.concurrent`包中的锁(如`ReentrantLock`)以及`wait()`, `notify()`和`notifyAll()`方法。这些方法是Object类的方法,用于在同步块或同步方法内部进行...
Java并发编程中的ReentrantLock是Java并发包(java.util.concurrent,简称JUC)中的一个重要的锁机制,它是Lock接口的一个具体实现,提供了比synchronized更强大的锁定功能和更细粒度的控制。ReentrantLock的主要...
在Java中,可以通过两种方式创建线程:继承Thread类或实现Runnable接口。在这个项目中,每个角色(如食客、厨师)可能都代表一个独立的线程,每个线程负责特定的任务,例如食客下单、厨师烹饪、烤箱烘烤食物等。这种...
Java并发之ReentrantLock类源码解析 ReentrantLock是Java并发包中的一种同步工具,它可以实现可重入锁的功能。ReentrantLock类的源码分析对理解Java并发机制非常重要。本文将对ReentrantLock类的源码进行详细分析,...
- **Lock接口和ReentrantLock类**:提供比`synchronized`更细粒度的锁控制,支持公平锁、非公平锁、可重入锁、读写锁等特性。 - **Semaphore信号量**:控制同时访问特定资源的线程数量。 - **CyclicBarrier和...
### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...
Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...
- 获取当前线程`current = Thread.currentThread();` - 获取当前`state`值`c = getState();` - **锁空闲**:如果`state`为0,尝试使用CAS将`state`设置为1。 - CAS成功则设置当前线程为锁的所有者,并返回true。 -...