`

ReentrantLock() 多个Condition c1 = lock.newCondit()使用

 
阅读更多
package com.bjsxt.height.lock020;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class UseManyCondition {

	private ReentrantLock lock = new ReentrantLock();
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	
	public void m1(){
		try {
			lock.lock();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m1等待..");
			c1.await();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m1继续..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m2(){
		try {
			lock.lock();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m2等待..");
			c1.await();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m2继续..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m3(){
		try {
			lock.lock();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m3等待..");
			c2.await();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m3继续..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m4(){
		try {
			lock.lock();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");
			c1.signalAll();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m5(){
		try {
			lock.lock();
			System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");
			c2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public static void main(String[] args) {
		
		
		final UseManyCondition umc = new UseManyCondition();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m1();
			}
		},"t1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m2();
			}
		},"t2");
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m3();
			}
		},"t3");
		Thread t4 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m4();
			}
		},"t4");
		Thread t5 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m5();
			}
		},"t5");
		
		t1.start();	// c1
		t2.start();	// c1
		t3.start();	// c2
		

		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		t4.start();	// c1
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t5.start();	// c2
		
	}
	
	
	
}

 

分享到:
评论

相关推荐

    JavaLock与Condition的理解Reentran

    在ReentrantLock中,可以创建多个Condition,每个Condition对应一个独立的等待队列,这样可以实现更灵活的线程通信和同步策略。 **三、使用示例** 以下是一个简单的ReentrantLock和Condition使用示例: ```java ...

    java多线程系列(四)ReentrantLock的使用.docx

    4. **Condition对象**:`ReentrantLock`的一个重大优势是它可以创建多个`Condition`对象,每个`Condition`对象对应一个等待队列。这样可以实现更精细化的线程通信。`condition.await()`会将线程放入对应的等待队列,...

    ArrayBlockingQueue源码解析-动力节点共

    这些操作都依赖于ReentrantLock和两个Condition对象:notEmpty(队列非空条件)和notFull(队列未满条件)。 **4. 插入元素(put)** 当队列为空时,生产者会调用`put`方法插入元素。此操作会阻塞直到队列有空间...

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

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

    Lock、Synchoronized和ReentrantLock的使用

    Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...

    21 更高级的锁—深入解析Lock.pdf

    使用ReentrantLock需要显式地调用lock()和unlock()方法。在尝试获取锁时,应将代码放入try-finally块中,以确保无论发生什么异常,都能正确释放锁。基本用法如下: ```java Lock lock = new ReentrantLock(); lock....

    java多线程实现生产者和消费者

    在Java编程中,多线程是并发处理任务的关键机制,而生产者-消费者问题是多线程编程中的一个经典模型。这个模型描述了两个角色:生产者(Producer)负责创建资源,消费者(Consumer)则负责消耗这些资源。为了解决...

    JAVA-基础多线程

    private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); private int flag = 1; public void print1() { lock.lock(); ...

    wait,notify等线程知识.pdf

    - 如果有多个线程都在等待同一个锁,则调用 `notify()` 只能唤醒其中一个线程,而 `notifyAll()` 则会唤醒所有等待的线程。 - 被唤醒的线程需要重新获取锁才能继续执行,这意味着它需要等待其他持有锁的线程释放锁...

    Lock详解.pdf

    1. **可重入性**:ReentrantLock允许一个线程多次获取同一锁,即在持有锁的情况下可以再次获取,这与synchronized的可重入性相同。 2. **公平性与非公平性**:ReentrantLock可以通过构造函数参数选择是否为公平锁。...

    【BAT必备】并发编程锁面试题

    以上示例展示了如何使用ReentrantLock和Condition实现生产者消费者模式,其中涉及了锁的基本使用方法以及Condition的信号传递机制。 #### 五、总结 并发编程是现代软件开发中不可或缺的一部分,正确理解和使用锁...

    java ReentrantLock详解.docx

    `ReentrantLock`支持多个条件对象,每个条件都关联着一个等待队列。通过`Condition`接口,可以实现更复杂的同步控制,比如精确的等待/唤醒机制。 7. **用法示例**: - 在`ServiceIsFair`示例中,我们创建了`...

    java实现两个线程交替打印的实例代码

    在本篇文章中,我们将使用两种方法来实现两个线程交替打印:使用 ReentrantLock 和 Condition 实现线程交替打印,以及使用 LinkedTransferQueue 实现线程交替打印。 使用 ReentrantLock 和 Condition 实现线程交替...

    Java JDK1.5 生产消费者模式解决方案

    这里可以使用`ArrayBlockingQueue`,它是线程安全的队列,但为了演示`Lock`和`Condition`,我们可以自定义一个使用`ReentrantLock`的`Buffer`类: ```java import java.util.concurrent.locks.Condition; import ...

    使用ReentrantLock和Lambda表达式让同步更

    在高级并发编程中,`ReentrantLock`是一个强大的工具,相较于内置的`synchronized`关键字,它提供了更多的灵活性和控制。本篇文章将深入探讨`ReentrantLock`的使用以及如何结合Lambda表达式来优化同步代码。 `...

    ReentrantLock代码剖析之ReentrantLock_lock

    在本文中,我们将深入分析`ReentrantLock`的`lock()`方法,理解其内部机制,包括锁的获取、释放以及公平性和非公平性的实现。 首先,`ReentrantLock`的`lock()`方法很简单,它只是调用了内部类`Sync`的`lock()`方法...

    java的Lock锁原理详解.docx

    以下是一个简单的Lock使用示例,展示了ReentrantLock的使用: ```java ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) throws InterruptedException { lock.lock(); // 获取...

    one lock.zip

    "one lock.zip"这个压缩包文件的名称暗示了其内容可能与锁定机制或者单线程、多线程编程中的锁有关。在IT行业中,尤其是在软件开发特别是并发编程领域,"lock"一词经常用来指代同步原语,用于管理对共享资源的访问,...

    java 资源搜索并下载(线程等待和通报)

    为了加快资源下载速度,我们可以使用多线程。每个线程负责下载不同的资源,`java.util.concurrent`包提供了丰富的工具,如`ExecutorService`和`Future`,可以方便地管理线程池和控制并发执行。线程池可以避免频繁...

    Java concurrency之Condition条件_动力节点Java学院整理

    1. **同步锁**:`Condition`必须与一个`Lock`实例关联,如`ReentrantLock`。与`synchronized`不同,`synchronized`是基于 JVM 的内置锁,而`Condition`是基于用户层面的锁,提供更高级别的控制。 2. **等待/通知...

Global site tag (gtag.js) - Google Analytics