`

java ReentrantLock Condition调试记录

 
阅读更多

今天看了多线程使用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之后,才继续往下走。

 

留此文便查

 

分享到:
评论
2 楼 smallbee 2013-10-23  
xin_jmail 写道
首先感谢楼主的文章,让我知道了lock.newCondition()的用法。实验完,发现Condition的await()、signal()、signalAll()方法和wait()、notify()、notifyAll()方法作用类似。

最后关于第二个使用 Condition例子,发表下我的观点。
如果线程1先于线程0运行,那么线程1运行condition.signal()语句后,由于目前线程0还没有进入await(),所以不会“激活”任何线程。待线程1释放锁后,当线程0运行时,运行await()方法,就一直等待别的线程激活。结果因线程1已运行完,线程0就一直等待,程序“卡死”。



确实存在你说的问题,我们项目的场景可能和你说的不一样,对于线程1会循环处理。
1 楼 xin_jmail 2013-10-11  
首先感谢楼主的文章,让我知道了lock.newCondition()的用法。实验完,发现Condition的await()、signal()、signalAll()方法和wait()、notify()、notifyAll()方法作用类似。

最后关于第二个使用 Condition例子,发表下我的观点。
如果线程1先于线程0运行,那么线程1运行condition.signal()语句后,由于目前线程0还没有进入await(),所以不会“激活”任何线程。待线程1释放锁后,当线程0运行时,运行await()方法,就一直等待别的线程激活。结果因线程1已运行完,线程0就一直等待,程序“卡死”。


相关推荐

    Java多线程中ReentrantLock与Condition详解

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

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    在Java多线程编程中,ReentrantLock提供了更灵活的锁管理机制,相比synchronized,它允许更细粒度的控制,并且提供了更多的同步原语。以下是一些使用ReentrantLock的关键点: 1. **可重入性**:ReentrantLock允许一...

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    在Java并发编程中,理解和熟练使用同步机制是至关重要的,这包括了`ReentrantLock`和`synchronized`关键字。这两个工具都是为了确保多线程环境中的数据一致性与安全性,防止出现竞态条件和死锁等问题。 `...

    Java学习100天速成课件

    线程同步是多线程编程的关键,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关的并发工具类,如ReentrantLock和Condition。 2. **输入输出(IO)**:Java的IO系统提供了一系列的类...

    Java concurrency之互斥锁_动力节点Java学院

    总之,`ReentrantLock`在Java并发编程中扮演着重要角色,提供了比`synchronized`更灵活的锁控制机制,包括可重入性、公平性和显式锁获取与释放,以及丰富的监控和调试功能,有助于编写更高效、更可控的多线程代码。

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

    5. **ReentrantLock和Condition**:如果不想使用`synchronized`关键字,可以使用`java.util.concurrent.locks.ReentrantLock`和`Condition`接口,它们提供了更细粒度的锁控制和更灵活的等待/通知机制。 6. **死锁和...

    实战Java高并发程序设计第二版随书代码

    - **线程同步**:为了防止多个线程同时访问共享资源导致的数据不一致,Java提供了synchronized关键字、 volatile变量、Lock接口(如ReentrantLock)等同步机制。 2. **并发控制** - **volatile**:了解volatile...

    电梯模拟器 java 代码

    Java提供了`synchronized`关键字和`Lock`接口(如`ReentrantLock`)来实现线程安全。 4. **条件变量(Condition)**:在电梯系统中,电梯可能需要等待特定条件满足(如某楼层有乘客或到达指定位置)。Java的`Lock`...

    java线程.rar

    为了防止多个线程同时访问共享资源,Java提供了多种同步机制,包括synchronized关键字、wait()、notify()和notifyAll()方法、Lock接口(如ReentrantLock)以及Condition接口。正确使用同步可以避免数据竞争和死锁...

    Java面试题及答案大全(2023持续更新)

    - 同步机制:synchronized关键字, volatile变量,Lock接口(如ReentrantLock)以及Condition。 - 死锁、活锁、饥饿现象及其避免策略。 5. **设计模式**: - 创建型模式:单例、工厂、抽象工厂、建造者、原型。 ...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    2. **同步机制**:详细解析了Java中的同步工具,如`synchronized`关键字、volatile变量、java.util.concurrent包中的Lock接口及其实现,如ReentrantLock,以及Condition等。同时,还会探讨如何正确地使用这些机制...

    java项目实践之电梯模拟调度算法

    Java提供了多种并发工具,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`等,用于管理共享资源的访问。 4. **GUI(图形用户界面)**:电梯模拟通常会使用GUI展示电梯的状态和楼层信息,让...

    基于JAVA的网络通讯系统设计与实现(系统)

    10. **日志和调试**:使用如Log4j或Java内置的日志框架记录系统运行日志,便于调试和问题定位。 综上所述,基于Java的网络通讯系统设计涉及了多方面的技术,包括网络编程基础、多线程、IO流、NIO、异常处理、设计...

    读者写者问题 JAVA

    可以使用`Condition`接口配合`ReentrantLock`实现。 5. **公平竞争策略**:在这种策略下,读者和写者公平竞争资源,没有优先级之分,按照请求顺序执行。这通常需要更复杂的同步结构,例如使用多个条件变量。 6. **...

    java笔试面试大全-附答案

    - **同步机制**:synchronized关键字、Lock锁(如ReentrantLock)、信号量Semaphore、条件变量Condition等。 - **线程状态**:新建、就绪、运行、阻塞、死亡。 4. **反射**: - 反射API:Class类、Constructor类...

    java哲学家就餐问题(eclipse版)

    3. **ReentrantLock和Condition**:Java的并发库提供了更高级的锁机制。在某些复杂情况下,ReentrantLock和Condition可能提供更灵活的控制。在这个问题中,我们可以通过条件变量来控制哲学家何时可以开始吃饭。 在...

    购票的Java源代码(十种实现代码)

    3. **锁机制**:除了synchronized,Java还提供了Lock接口(如ReentrantLock)作为更高级的同步机制,可以提供更细粒度的控制,比如公平锁、非公平锁、读写锁等。 4. **条件变量**:在Java并发库中,Condition接口...

    操作系统,多线程编程,多进程编程,java

    Java提供了一系列的同步机制来解决这些问题,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)和Condition对象。实验指导书中可能详细讲解了如何使用这些工具确保线程...

    Java常见错误列表Java开发Java经验技巧共20页

    - 理解并发控制机制,如`synchronized`关键字、锁(ReentrantLock等)、条件变量(Condition)等。 - 了解线程安全的数据结构,如`ConcurrentHashMap`和`Atomic`系列类。 5. **集合框架**: - 熟悉`List`、`Set`...

Global site tag (gtag.js) - Google Analytics