今天看了多线程使用Lock和Condition
package com.cmb.firmbank.baseFrame.socket; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class X { private final ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void m(int i) { System.out.println("m start!"); lock.lock(); // block until condition holds try { System.out.println("try catch!"); } finally { lock.unlock(); } System.out.println("m end!"); } public static void main(String[] args) { X x = new X(); T1 t1 = new T1(x); T2 t2 = new T2(x); t1.start(); t2.start(); } } class T1 extends Thread{ private X x ; public T1(X x) { this.x = x; } @Override public void run() { x.m(0); } } class T2 extends Thread{ private X x ; public T2(X x) { this.x = x; } @Override public void run() { x.m(1); } }
一个线程进入lock里面,另外一个现场就无法进入lock,直到lock的线程unlock之后,第二个线程才能进入。
使用condition
package com.cmb.firmbank.baseFrame.socket; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class X { private final ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void m(int i) { System.out.println("m start!"); lock.lock(); // block until condition holds try { // ... method body if(i==0){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } else if(i==1){ condition.signal(); } System.out.println("try catch!"); } finally { lock.unlock(); } System.out.println("m end!"); } public static void main(String[] args) { X x = new X(); T1 t1 = new T1(x); T2 t2 = new T2(x); t1.start(); t2.start(); } } class T1 extends Thread{ private X x ; public T1(X x) { this.x = x; } @Override public void run() { x.m(0); } } class T2 extends Thread{ private X x ; public T2(X x) { this.x = x; } @Override public void run() { x.m(1); } }
当一个线程进入lock里面,未到condition.await()时,第二个线程无法进入lock里面,但是当第一个线程进入await等待时,第二个线程可以进入lock,直到第二个线程进入unlock后,第一个线程才从await往下走。
总结:
1、如果不使用condition,多个线程中只有一个能进入lock逻辑里面。
2、如果在lock中使用await,当前线程会等待,其他等待线程进入lock,当前线程直到其他线程的siginal之后,才继续往下走。
留此文便查
相关推荐
Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...
在Java多线程编程中,ReentrantLock提供了更灵活的锁管理机制,相比synchronized,它允许更细粒度的控制,并且提供了更多的同步原语。以下是一些使用ReentrantLock的关键点: 1. **可重入性**:ReentrantLock允许一...
在Java并发编程中,理解和熟练使用同步机制是至关重要的,这包括了`ReentrantLock`和`synchronized`关键字。这两个工具都是为了确保多线程环境中的数据一致性与安全性,防止出现竞态条件和死锁等问题。 `...
线程同步是多线程编程的关键,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关的并发工具类,如ReentrantLock和Condition。 2. **输入输出(IO)**:Java的IO系统提供了一系列的类...
总之,`ReentrantLock`在Java并发编程中扮演着重要角色,提供了比`synchronized`更灵活的锁控制机制,包括可重入性、公平性和显式锁获取与释放,以及丰富的监控和调试功能,有助于编写更高效、更可控的多线程代码。
5. **ReentrantLock和Condition**:如果不想使用`synchronized`关键字,可以使用`java.util.concurrent.locks.ReentrantLock`和`Condition`接口,它们提供了更细粒度的锁控制和更灵活的等待/通知机制。 6. **死锁和...
Java提供了多种并发工具,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`等,用于管理共享资源的访问。 4. **GUI(图形用户界面)**:电梯模拟通常会使用GUI展示电梯的状态和楼层信息,让...
- **线程同步**:为了防止多个线程同时访问共享资源导致的数据不一致,Java提供了synchronized关键字、 volatile变量、Lock接口(如ReentrantLock)等同步机制。 2. **并发控制** - **volatile**:了解volatile...
Java提供了`synchronized`关键字和`Lock`接口(如`ReentrantLock`)来实现线程安全。 4. **条件变量(Condition)**:在电梯系统中,电梯可能需要等待特定条件满足(如某楼层有乘客或到达指定位置)。Java的`Lock`...
为了防止多个线程同时访问共享资源,Java提供了多种同步机制,包括synchronized关键字、wait()、notify()和notifyAll()方法、Lock接口(如ReentrantLock)以及Condition接口。正确使用同步可以避免数据竞争和死锁...
- 同步机制:synchronized关键字, volatile变量,Lock接口(如ReentrantLock)以及Condition。 - 死锁、活锁、饥饿现象及其避免策略。 5. **设计模式**: - 创建型模式:单例、工厂、抽象工厂、建造者、原型。 ...
2. **同步机制**:详细解析了Java中的同步工具,如`synchronized`关键字、volatile变量、java.util.concurrent包中的Lock接口及其实现,如ReentrantLock,以及Condition等。同时,还会探讨如何正确地使用这些机制...
10. **日志和调试**:使用如Log4j或Java内置的日志框架记录系统运行日志,便于调试和问题定位。 综上所述,基于Java的网络通讯系统设计涉及了多方面的技术,包括网络编程基础、多线程、IO流、NIO、异常处理、设计...
可以使用`Condition`接口配合`ReentrantLock`实现。 5. **公平竞争策略**:在这种策略下,读者和写者公平竞争资源,没有优先级之分,按照请求顺序执行。这通常需要更复杂的同步结构,例如使用多个条件变量。 6. **...
- **同步机制**:synchronized关键字、Lock锁(如ReentrantLock)、信号量Semaphore、条件变量Condition等。 - **线程状态**:新建、就绪、运行、阻塞、死亡。 4. **反射**: - 反射API:Class类、Constructor类...
3. **ReentrantLock和Condition**:Java的并发库提供了更高级的锁机制。在某些复杂情况下,ReentrantLock和Condition可能提供更灵活的控制。在这个问题中,我们可以通过条件变量来控制哲学家何时可以开始吃饭。 在...
3. **锁机制**:除了synchronized,Java还提供了Lock接口(如ReentrantLock)作为更高级的同步机制,可以提供更细粒度的控制,比如公平锁、非公平锁、读写锁等。 4. **条件变量**:在Java并发库中,Condition接口...
Java提供了一系列的同步机制来解决这些问题,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)和Condition对象。实验指导书中可能详细讲解了如何使用这些工具确保线程...
- 理解并发控制机制,如`synchronized`关键字、锁(ReentrantLock等)、条件变量(Condition)等。 - 了解线程安全的数据结构,如`ConcurrentHashMap`和`Atomic`系列类。 5. **集合框架**: - 熟悉`List`、`Set`...