Java Condition

在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现,这里注意,Condition是被绑定到Lock上的,要创建一个Lock的Condition必须用newCondition()方法。

class BoundedBuffer {

final Lock lock = new ReentrantLock();//锁对象

final Condition notFull  = lock.newCondition();//写线程条件

final Condition notEmpty = lock.newCondition();//读线程条件

final Object[] items = new Object[100];//缓存队列

int putptr/*写索引*/, takeptr/*读索引*/, count/*队列中存在的数据个数*/;

publicvoid put(Object x) throws InterruptedException {

lock.lock();

try {

while (count == items.length)//如果队列满了

notFull.await();//阻塞写线程

items[putptr] = x;//赋值

if (++putptr == items.length) putptr = 0;//如果写索引写到队列的最后一个位置了,那么置为0

++count;//个数++

notEmpty.signal();//唤醒读线程

finally {

lock.unlock();

}

}

public Object take() throws InterruptedException {

lock.lock();

try {

while (count == 0)//如果队列为空

notEmpty.await();//阻塞读线程

Object x = items[takeptr];//取值

if (++takeptr == items.length) takeptr = 0;//如果读索引读到队列的最后一个位置了,那么置为0

--count;//个数--

notFull.signal();//唤醒写线程

return x;

finally {

lock.unlock();

}

}

}

时间: 2024-08-26 06:35:21

Java Condition的相关文章

Java Condition详解

在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurrent包提供的一种独占锁的实现.它继承自Dong Lea的 AbstractQueuedSynchronizer(同步器),确切的说是ReentrantLock的一个内部类继承了AbstractQueuedSynchronizer,ReentrantLock只不过是代理了该类的一些方法,可能有人会问为什

java Condition条件变量的基本使用及注意点

最近在看pthread方面的书,看到条件变量一节的时候,回忆了下java中条件变量的使用方式. java中条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这样,条件就和一个锁对象绑定起来了.因此,Java中的条件变量只能和锁配合使用,来控制并发程序访问竞争资源的安全. 条件变量的出现是为了更精细控制线程等待与唤醒,在Java5之前,线程的等待与唤醒依靠的是Objec

[图解Java]Condition

图解Condition 0. demo 我先给出一个demo, 这样大家就可以根据我给的这段代码, 边调试边看源码了. 还是那句话: 注意"My" , 我把ReentrantLock类 改名为了 "MyReentrantLock"类 , "Lock"类 改名为了"MyLock"类. 大家粘贴我的代码的时候, 把相应的"My"都去掉就好了, 否则会编译报错哦. import java.util.Scanner

java condition 实现简单的阻塞队列

上一篇文章介绍了condition的使用方法 https://www.cnblogs.com/liumy/p/11563772.html 这一篇文章介绍如何用condition来实现一个简单的阻塞队列 消费者 生产者模式. 消费者 生产者模式就是 生产者生产某些对象,消费者来消费这些对象.其中用对象数组来保存这些对象,既然是数组,在初始化的时候需要指定数组的大小. 在生产者生产的时候需要检查数组是否已经满了,如果满了,那么生产者会被挂起,等到有消费者消费对象时,再进行生产. 当消费者消费的时候,

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

java 锁2

并发,其实是多线程才有的场景... java 多线程? 锁? 现在看来,即使已经工作了4.5年,这仍然不是一个简单的问题. 其实java 本身有提供锁的机制. 比如 Object对象的 wait .notify 方法.synchronized 的原理不过是直接调用对应的对象的 wait方法罢了! 看tomcat 源码的时候,多线程的地方就是直接用到了 wait .notify等方法 —— 这些方法真高级, 一般哪里会用得着???!!! 1 synchronized 其实这个算是容易学的东西了,相

多线程编程中条件变量和的spurious wakeup 虚假唤醒

1. 概述 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 1) 线程等待某个条件, 条件为真则继续执行,条件为假则将自己挂起(避免busy wait,节省CPU资源): 2) 线程执行某些处理之后,条件成立:则通知等待该条件的线程继续执行. 3) 为了防止race-condition,条件变量总是和互斥锁变量mutex结合在一起使用. 一般的编程模式: C++代码  

(四)Lock,ReentrantLock,ReentrantReadWriteLock类的使用以及相关api---synchronized进阶

这篇博客记录了Lock,ReentrantLock,ReentrantReadWriteLock类的使用以及其一些api: 码字不易~~另外<java多线程编程核心技术>这本书读着很爽 前言说明:之前为了解决多线程时的非线程安全问题,使用的是synchronized.接下来记录的是他的升级版本ReentrantLock,更加灵活,可控性更高,而ReentrantReadWriteLock类是对ReentrantLock类的补充,能够在某些条件之间之下提交效率 下面先来看下都有哪些api,以及和

可以用命令行控制eclipse断点增加删除、远程调试创建与启动的插件

java # 创建断点(支持条件断点) curl -X PUT -H "Content-Type:application/json" --data '{"language":"java","condition":"i == 1","charStart":283,"charEnd":307,"lineNumber":16,"typeName