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 } }
相关推荐
在ReentrantLock中,可以创建多个Condition,每个Condition对应一个独立的等待队列,这样可以实现更灵活的线程通信和同步策略。 **三、使用示例** 以下是一个简单的ReentrantLock和Condition使用示例: ```java ...
4. **Condition对象**:`ReentrantLock`的一个重大优势是它可以创建多个`Condition`对象,每个`Condition`对象对应一个等待队列。这样可以实现更精细化的线程通信。`condition.await()`会将线程放入对应的等待队列,...
这些操作都依赖于ReentrantLock和两个Condition对象:notEmpty(队列非空条件)和notFull(队列未满条件)。 **4. 插入元素(put)** 当队列为空时,生产者会调用`put`方法插入元素。此操作会阻塞直到队列有空间...
- **Condition**:`ReentrantLock`支持多个条件变量,每个`Condition`对象都有自己的等待队列,可以实现更细粒度的同步控制。与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal...
Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...
使用ReentrantLock需要显式地调用lock()和unlock()方法。在尝试获取锁时,应将代码放入try-finally块中,以确保无论发生什么异常,都能正确释放锁。基本用法如下: ```java Lock lock = new ReentrantLock(); lock....
在Java编程中,多线程是并发处理任务的关键机制,而生产者-消费者问题是多线程编程中的一个经典模型。这个模型描述了两个角色:生产者(Producer)负责创建资源,消费者(Consumer)则负责消耗这些资源。为了解决...
private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); private int flag = 1; public void print1() { lock.lock(); ...
- 如果有多个线程都在等待同一个锁,则调用 `notify()` 只能唤醒其中一个线程,而 `notifyAll()` 则会唤醒所有等待的线程。 - 被唤醒的线程需要重新获取锁才能继续执行,这意味着它需要等待其他持有锁的线程释放锁...
1. **可重入性**:ReentrantLock允许一个线程多次获取同一锁,即在持有锁的情况下可以再次获取,这与synchronized的可重入性相同。 2. **公平性与非公平性**:ReentrantLock可以通过构造函数参数选择是否为公平锁。...
以上示例展示了如何使用ReentrantLock和Condition实现生产者消费者模式,其中涉及了锁的基本使用方法以及Condition的信号传递机制。 #### 五、总结 并发编程是现代软件开发中不可或缺的一部分,正确理解和使用锁...
`ReentrantLock`支持多个条件对象,每个条件都关联着一个等待队列。通过`Condition`接口,可以实现更复杂的同步控制,比如精确的等待/唤醒机制。 7. **用法示例**: - 在`ServiceIsFair`示例中,我们创建了`...
在本篇文章中,我们将使用两种方法来实现两个线程交替打印:使用 ReentrantLock 和 Condition 实现线程交替打印,以及使用 LinkedTransferQueue 实现线程交替打印。 使用 ReentrantLock 和 Condition 实现线程交替...
这里可以使用`ArrayBlockingQueue`,它是线程安全的队列,但为了演示`Lock`和`Condition`,我们可以自定义一个使用`ReentrantLock`的`Buffer`类: ```java import java.util.concurrent.locks.Condition; import ...
在高级并发编程中,`ReentrantLock`是一个强大的工具,相较于内置的`synchronized`关键字,它提供了更多的灵活性和控制。本篇文章将深入探讨`ReentrantLock`的使用以及如何结合Lambda表达式来优化同步代码。 `...
在本文中,我们将深入分析`ReentrantLock`的`lock()`方法,理解其内部机制,包括锁的获取、释放以及公平性和非公平性的实现。 首先,`ReentrantLock`的`lock()`方法很简单,它只是调用了内部类`Sync`的`lock()`方法...
以下是一个简单的Lock使用示例,展示了ReentrantLock的使用: ```java ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) throws InterruptedException { lock.lock(); // 获取...
"one lock.zip"这个压缩包文件的名称暗示了其内容可能与锁定机制或者单线程、多线程编程中的锁有关。在IT行业中,尤其是在软件开发特别是并发编程领域,"lock"一词经常用来指代同步原语,用于管理对共享资源的访问,...
为了加快资源下载速度,我们可以使用多线程。每个线程负责下载不同的资源,`java.util.concurrent`包提供了丰富的工具,如`ExecutorService`和`Future`,可以方便地管理线程池和控制并发执行。线程池可以避免频繁...
1. **同步锁**:`Condition`必须与一个`Lock`实例关联,如`ReentrantLock`。与`synchronized`不同,`synchronized`是基于 JVM 的内置锁,而`Condition`是基于用户层面的锁,提供更高级别的控制。 2. **等待/通知...