`

multi-thread(六)ReentrantLock,Condition

 
阅读更多
/**
 * 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();
            }
        }
    }
}

 

分享到:
评论

相关推荐

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    - **Condition**:`ReentrantLock`支持多个条件变量,每个`Condition`对象都有自己的等待队列,可以实现更细粒度的同步控制。与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal...

    ReentrantLock与synchronized

    - 分离锁和条件:`ReentrantLock`有`Condition`接口,可以创建多个条件,每个条件对应一个等待队列,提高了线程间的协作能力。 4. **灵活性**: - 更好的控制粒度,可以只锁定需要的部分代码,提高并发效率。 - ...

    Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf

    Java中的ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个高级锁,它是可重入的,意味着一个线程可以多次获取同一锁。在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java...

    contention-profiling:ReentrantLock 和 ReentrantReadWriteLock 上的配置文件争用

    `ReentrantLock`和`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的两个重要工具,它们提供了比标准`synchronized`关键字更高级别的锁控制机制。本文将深入探讨这两个类,以及如何通过配置...

    ReentrantLock源码详解--条件锁

    在上面的代码中,我们创建了一个ReentrantLock和一个Condition,然后我们启动了一个线程,该线程会等待条件成立,而另一个线程则会通知条件已成立。 Condition的await()方法 ------------------------- Condition...

    thread源码java-java-multi-thread-programming:java多线程编程核心技术

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升软件的效率和响应...在实际项目中,结合Java的开源库,如`java-multi-thread-programming-master`,可以进一步提升我们的多线程编程能力。

    thread-multi.zip

    "thread-multi.zip"这个压缩包文件显然包含了一个与Java多线程相关的项目,它可能是一个示例工程,帮助开发者理解如何利用多线程来查询批量数据。下面我们将详细探讨Java多线程的相关知识点以及在批量数据查询中的...

    java ReentrantLock详解.docx

    - `hasQueuedThread(Thread thread)`:检查指定的线程是否正在等待获取锁。 5. **尝试获取锁**: `tryLock()`方法允许线程尝试获取锁,如果立即成功则返回`true`,否则返回`false`。还有一个可接受超时参数的版本...

    带你看看Java的锁(一)-ReentrantLock

    带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...

    CyclicBarrier,reentrantlock,condition模拟抢票

    用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620

    Java中ReentrantLock的使用.docx

    - Condition是ReentrantLock的重要补充,可以创建多个Condition对象,每个Condition对应一个等待队列。线程调用`await()`方法会释放锁并进入对应的等待队列,等待被`signal()`或`signalAll()`唤醒。Condition的等待...

    java-multi-thread:《 Java多线程编程核心技术》源代码-java source code

    - `Lock` 接口及实现:如 `ReentrantLock` 提供可中断、公平锁等高级特性。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 - `CyclicBarrier` 和 `CountDownLatch`:协调多个线程间的同步。 3. **...

    Java_multi-threaded_programming_pitfalls.rar_java programming

    Java提供了多种同步机制,如`synchronized`关键字、`java.util.concurrent`包中的锁(如`ReentrantLock`)以及`wait()`, `notify()`和`notifyAll()`方法。这些方法是Object类的方法,用于在同步块或同步方法内部进行...

    java并发编程专题(五)----详解(JUC)ReentrantLock

    Java并发编程中的ReentrantLock是Java并发包(java.util.concurrent,简称JUC)中的一个重要的锁机制,它是Lock接口的一个具体实现,提供了比synchronized更强大的锁定功能和更细粒度的控制。ReentrantLock的主要...

    Multi-Threaded-Restaurant

    在Java中,可以通过两种方式创建线程:继承Thread类或实现Runnable接口。在这个项目中,每个角色(如食客、厨师)可能都代表一个独立的线程,每个线程负责特定的任务,例如食客下单、厨师烹饪、烤箱烘烤食物等。这种...

    Java并发之ReentrantLock类源码解析

    Java并发之ReentrantLock类源码解析 ReentrantLock是Java并发包中的一种同步工具,它可以实现可重入锁的功能。ReentrantLock类的源码分析对理解Java并发机制非常重要。本文将对ReentrantLock类的源码进行详细分析,...

    nimbo-java-multi-threading:Java多线程演示代码

    - **Lock接口和ReentrantLock类**:提供比`synchronized`更细粒度的锁控制,支持公平锁、非公平锁、可重入锁、读写锁等特性。 - **Semaphore信号量**:控制同时访问特定资源的线程数量。 - **CyclicBarrier和...

    ReentrantLock 与 synchronized 简介

    ### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...

    Java多线程中ReentrantLock与Condition详解

    Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...

    ReentrantLock源码分析

    - 获取当前线程`current = Thread.currentThread();` - 获取当前`state`值`c = getState();` - **锁空闲**:如果`state`为0,尝试使用CAS将`state`设置为1。 - CAS成功则设置当前线程为锁的所有者,并返回true。 -...

Global site tag (gtag.js) - Google Analytics