`

java并发 locks包:Condition(二)

 
阅读更多

本文基本是JDK文档中的说明内容,但是已经很好的解释了Condition对象的使用方法。

 

Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。 

 

条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通知它之前,一直挂起该线程(即让其“等待”)。因为访问此共享状态信息发生在不同的线程中,所以它必须受保护,因此要将某种形式的锁与该条件相关联。等待提供一个条件的主要属性是:以原子方式 释放相关的锁,并挂起当前线程,就像 Object.wait 做的那样。 

 

Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,请使用其 newCondition() 方法。 

 

作为一个示例,假定有一个绑定的缓冲区,它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待 set 中保存 put 线程和 take 线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个 Condition 实例来做到这一点。 

 

代码实例:

package com.mutex;

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

/**
 * 实现自己的阻塞队列
 */
public class MyBlockingQueue<T> {

	private final Lock lock = new ReentrantLock();

	private Condition notFull = lock.newCondition();
	private Condition notEmpty = lock.newCondition();

	private final Object[] items = new Object[100];
	private int putptr, takeptr, count;

	public void put(T x) {
		lock.lock();
		try {
			while (count == items.length)
				notFull.await();

			items[putptr] = x;
			if (++putptr == items.length)
				putptr = 0;

			++count;

			notEmpty.signal();

		} catch (InterruptedException e) {
			// todo
		} finally {
			lock.unlock();
		}
	}

	public T take() {
		lock.lock();
		try {
			while (count == 0)
				notEmpty.await();

			T x = (T) items[takeptr];
			if (++takeptr == items.length)
				takeptr = 0;

			--count;

			notFull.signal();

			return x;
		} catch (InterruptedException e) {
			// todo
			return null;
		} finally {
			lock.unlock();
		}

	}

	public static void main(String[] args) {

		final MyBlockingQueue<String> bq = new MyBlockingQueue<String>();

		new Thread() {
			public void run() {
				int count = 0;
				while (true) {
					++count;
					bq.put("test: " + count);
				}
			}
		}.start();

		new Thread() {
			public void run() {
				while (true) {
					System.out.println(bq.take());
				}
			}
		}.start();
	}

}

 

 

 

分享到:
评论

相关推荐

    locks框架:接口.pdf

    这份资源旨在介绍 Java Locks 框架中的 Lock 接口及其相关内容。Lock 接口是 Locks 框架的核心,提供了更加灵活和可控的线程同步机制,用于替代传统的 synchronized 关键字。 Lock 接口概述: 简要介绍 Lock 接口,...

    Java并发包源码分析(JDK1.8)

    Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...

    Java并发:基础线程同步

    In this chapter, we will cover: 1.Synchronizing a method; 2.Arranging independent ... 5.Synchronizing data access with read/write locks 6.Modifying Lock fairness 7.Using multiple conditions in a Lock

    JAVA_API1.6文档(中文)

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    java中Locks的使用详解

    主要介绍了java中Locks的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java 1.6 API 中文 New

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...

    java api最新7.0

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的...java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

    JavaAPI1.6中文chm文档 part1

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    gridfs-locks:基于MongoDB的分布式读写锁,旨在让GridFS安全并发访问

    注意:如果您使用并需要此包的锁定功能(并且您可能这样做...请参阅本自述文件底部的“为什么?”部分),您应该查看 。 它基本上是 gridfs-stream + gridfs-locks。v1.x 中的新增功能遵循约定,版本 1.x 包含对...

    web-locks-polyfill:用于Web锁api的polyfill

    局限性这不支持navigator.locks.request(name, [options,] callback)的options参数。 因此,仅支持默认选项。 当前不支持navigator.locks.query 。 这使用localStorage作为锁定形式。 默认情况下,它期望这些锁仅...

    web-locks:网络锁API

    Web Locks API打算在将来合并到Node.js中。 特征 最简单的并行编程原语,用于解决数据争用和争用条件的问题。 Node.js和支持。 针对某些情况的不同优化实现:单线程异步锁,具有单个统一API的多线程锁。 安装 $ ...

    locks框架_ReentrantLock.pdf

    这份资源旨在详细讲解 Java 中的 Locks 框架,特别关注 ReentrantLock 的使用和原理。Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks ...

    JavaAPI中文chm文档 part2

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    java jdk-api-1.6 中文 chmd

    java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...

    \java超强笔记(超级经典)

    java.util.concurrent.locks 包含锁定的工具。 Executor接口: 替代了Thread类,他可以创建定量的、动态的以及周期性的线程池。 ExecutorService接口: 线程池,用来存放线程来节省创建和销毁资源的消耗...

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下

    [Java参考文档]

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

Global site tag (gtag.js) - Google Analytics