- 浏览: 3500111 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
Util.concurrent工具包概述
Doug Lea
State University of New York at Oswego
dl@cs.oswego.edu
http://gee.cs.oswego.edu
翻译:
Cocia Lin(cocia@163.com )
Huihoo.org
原文
http://gee.cs.oswego.edu/dl/cpjslides/util.pdf
要点
-- 目标和结构
-- 主要的接口和实现
Sync : 获得 / 释放 (acquire/release) 协议
Channel : 放置 / 取走 (put/take) 协议
Executor : 执行 Runnable 任务
-- 每一个部分都有一些关联的接口和支持类
-- 简单的涉及其他的类和特性
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
目标
-- 一些简单的接口
- 但是覆盖大部分程序员需要小心处理代码的问题
-- 高质量实现
- 正确的,保守的,有效率的,可移植的
-- 可能作为将来标准的基础
- 获取经验和收集反馈信息
Sync
-- acquire/release 协议的主要接口
- 用来定制锁,资源管理,其他的同步用途
- 高层抽象接口
- 没有区分不同的加锁用法
-- 实现
- Mutex, ReentrantLock, Latch, CountDown,Semaphore, WaiterPreferenceSemaphore, FIFOSemaphore, PrioritySemaphore
<!-- [if !supportLists]-->n <!-- [endif]-->还有,有几个简单的实现,例如 ObservableSync, LayeredSync
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
独占锁
try {
lock.acquire();
try {
action();
}
finally {
lock.release();
}
}
catch (InterruptedException ie) { ... }
-- Java 同步块不适用的时候使用它
- 超时,回退 (back-off)
- 确保可中断
- 大量迅速锁定
- 创建 Posix 风格应用 (condvar)
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
独占例子
class ParticleUsingMutex {
int x; int y;
final Random rng = new Random();
final Mutex mutex = new Mutex();
public void move() {
try {
mutex.acquire();
try { x += rng.nextInt(2)-1; y += rng.nextInt(2)-1; }
finally { mutex.release(); }
}
catch (InterruptedException ie) {
Thread.currentThread().interrupt(); }
}
public void draw(Graphics g) {
int lx, ly;
try {
mutex.acquire();
try { lx = x; ly = y; }
finally { mutex.release(); }
}
catch (InterruptedException ie) {
Thread.currentThread().interrupt(); return; }
g.drawRect(lx, ly, 10, 10);
}
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
回退 (Backoff) 例子
class CellUsingBackoff {
private long val;
private final Mutex mutex = new Mutex();
void swapVal(CellUsingBackoff other)
throws InterruptedException {
if (this == other) return; // alias check
for (;;) {
mutex.acquire();
try {
I f ( other.mutex.attempt(0) ) {
try {
long t = val;
val = other.val;
other.val = t;
return;
}
finally { other.mutex.release(); }
}
}
finally { mutex.release(); };
Thread.sleep(100); // heuristic retry interval
}
}
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
读写锁
interface ReadWriteLock {
Sync readLock();
Sync writeLock();
}
-- 管理一对锁
- 和普通的锁一样的使用习惯
-- 对集合类很有用
- 半自动的方式实现 SyncSet, SyncMap, ...
-- 实现者使用不同的锁策略
- WriterPreference, ReentrantWriterPreference,
ReaderPreference, FIFO
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
ReadWriteLock 例子
-- 示范在读写锁中执行任何 Runnable 的包装类
class WithRWLock {
final ReadWriteLock rw;
public WithRWLock(ReadWriteLock l) { rw = l; }
public void performRead(Runnable readCommand)
throws InterruptedException {
rw.readLock().acquire();
try { readCommand.run(); }
finally { rw.readlock().release(); }
}
public void performWrite(...) // similar
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
闭锁 (Latch)
-- 闭锁是开始时设置为 false, 但一旦被设置为 true ,他将永远保持 true 状态
- 初始化标志
- 流结束定位
- 线程中断
- 事件出发指示器
-- CountDown 和他有点类似,不同的是, CountDown 需要一定数量的触发设置,而不是一次
-- 非常简单,但是广泛使用的类
- 替换容易犯错的开发代码
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
Latch Example 闭锁例子
class Worker implements Runnable {
Latch startSignal;
Worker(Latch l) { startSignal = l; }
public void run() {
startSignal.acquire();
// ... doWork();
}
}
class Driver { // ...
void main() {
Latch ss = new Latch();
for (int i = 0; i < N; ++i) // make threads
new Thread(new Worker( ss )).start();
doSomethingElse(); // don’t let run yet
ss.release(); // now let all threads proceed
}
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
信号 (Semaphores)
-- 服务于数量有限的占有者
- 使用许可数量构造对象 ( 通常是 0)
- 如果需要一个许可才能获取,等待,然后取走一个许可
- 释放的时候将许可添加回来
-- 但是真正的许可并没有转移 (But no actual permits change hands.)
- 信号量仅仅保留当前的计数值
-- 应用程序
- 锁:一个信号量可以被用作互斥体 (mutex)
- 一个独立的等待缓存或者资源控制的操作
- 设计系统是想忽略底层的系统信号
-- (phores ‘remember’ past signals) 记住已经消失的信号量
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
信号量例子
class Pool {
ArrayList items = new ArrayList();
HashSet busy = new HashSet();
final Semaphore available;
public Pool(int n) {
available = new Semaphore(n);
// ... somehow initialize n items ...;
}
public Object getItem() throws InterruptedException {
available.acquire();
return doGet();
}
public void returnItem(Object x) {
if (doReturn(x)) available.release();
}
synchronized Object doGet() {
Object x = items.remove(items.size()-1);
busy.add(x); // put in set to check returns
return x;
}
synchronized boolean doReturn(Object x) {
return busy.remove(x); // true if was present
}
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
屏障 (Barrier)
-- 多部分同步接口
- 每一部分都必须等待其他的分不撞倒屏障
-- CyclicBarrier 类
- CountDown 的一个可以重新设置的版本
- 对于反复划分算法很有用 (iterative partitioning algorithms)
-- Rendezvous 类
- 一个每部分都能够和其他部分交换信息的屏障
- 行为类似同时的在一个同步通道上 put 和 take
- 对于资源交换协议很有用 (resource-exchange protocols)
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
通道 (Channel)
-- 为缓冲,队列等服务的主接口
-- 具体实现
- LinkedQueue, BoundedLinkedQueue,BoundedBuffer, BoundedPriorityQueue,SynchronousChannel, Slot
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
通道属性
-- 被定义为 Puttable 和 Takable 的子接口
- 允许安装生产者 / 消费者模式执行
-- 支持可超时的操作 offer 和 poll
- 当超时值是 0 时,可能会被阻塞
- 所有的方法能够抛出 InterruptedException 异常
-- 没有接口需要 size 方法
- 但是一些实现定义了这个方法
- BoundedChannel 有 capacity 方法
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
通道例子
class Service { // ...
final Channel msgQ = new LinkedQueue();
public void serve() throws InterruptedException {
String status = doService();
msgQ.put(status);
}
public Service() { // start background thread
Runnable logger = new Runnable() {
public void run() {
try {
for(;;)
System.out.println( msqQ.take() );
}
catch(InterruptedException ie) {} }
};
new Thread(logger).start();
}
}
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
<!-- [if !supportEmptyParas]--> <!-- [endif]-->
运行器 (Executor)
--
类似线程的类的主接口
font-size: 18pt; fon
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74145在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3757原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23491Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2133FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5516我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2346WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1565Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2120终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14836大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1709charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22610Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4882来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2370本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8683一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2902近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3700目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2537Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2099由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 3002安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1852本文介绍物理地址扩展 ...
相关推荐
Java 5 引入了 `java.util.concurrent` 包,该包提供了丰富的 API 来简化并发编程任务。本篇文章将深入探讨 `java.util.concurrent` 包中的一些核心概念和技术,特别是 `ConcurrentHashMap` 和 `...
Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...
以下是28个Java开发者经常使用的工具类的概述,这些工具类涵盖了广泛的用途: 1. **`java.util.Arrays`**: 这个类提供了对数组进行排序、查找、复制等操作的方法,如`Arrays.sort()`用于排序数组,`Arrays.asList()...
- `java.util.concurrent.locks`包提供了多种类型的锁,如`ReentrantLock`等。 ##### 4. 信号量 - `java.util.concurrent.Semaphore`用于控制对有限资源的访问。 ##### 5. 阻塞队列 - `java.util.concurrent....
11. **`java.util.concurrent`** 包:包含并发和多线程工具,如`ExecutorService`、`Future`和`Callable`。 12. **`java.util.logging.Logger`**:日志记录工具,用于输出程序运行时的信息。 13. **`java.lang....
综上所述,`java.util.concurrent`包提供的并发工具极大地简化了并发编程的复杂性,使得开发者可以更轻松地编写出高性能、可维护的并发应用程序。通过对这些工具的深入理解与合理运用,可以有效提高软件系统的并发...
虽然Java标准库中的`java.util.concurrent`包提供了强大的并发编程工具,但鉴于Android设备的性能限制和框架本身提供的Task机制,如`AsyncTask`,直接使用`java.util.concurrent`中的类(如`ExecutorService`、`...
Java平台提供了丰富的并发编程工具,其中`java.util.concurrent`包尤其引人注目。这个包包含了多种并发容器和实用工具,能够帮助开发者轻松地编写出高性能且可维护的并发应用程序。本文将深入探讨`java.util....
`java.lang.Thread`类允许创建和管理线程,而`java.util.concurrent`包则提供了高级并发工具,如`ExecutorService`、`Future`和`Semaphore`,帮助开发者更好地控制并发执行的线程。 4. **异常处理**:Java的异常...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...
- **`java.util.concurrent`包**:包含了大量用于实现并发编程的类,如`ThreadPoolExecutor`、`ScheduledThreadPoolExecutor`、`CountDownLatch`、`CyclicBarrier`等。 - **`CompletableFuture`**:Java 8引入并在...
`java.util.concurrent`包包含了高级并发工具,如`ExecutorService`、`Future`和`Semaphore`等,简化了并发编程的复杂度。 4. **网络编程**:`java.net`包提供了网络编程的基础组件,如`Socket`、`ServerSocket`和`...
1. **Concurrent 包**:Java 5.0 中新增了 `java.util.concurrent` 包,提供了许多高级的并发工具类,如 `ExecutorService`、`Future`、`Semaphore` 等,这些工具简化了线程管理和同步控制。 2. **原子操作类**:`...
13. **并发工具**:`java.util.concurrent`包还包含一系列高级并发工具,如`Semaphore`用于控制并发访问,`CountDownLatch`和`CyclicBarrier`用于同步任务。 Java API文档详尽地涵盖了这些知识点和其他许多内容,是...
- **并发编程**:`java.util.concurrent`包提供了线程安全的数据结构和高级并发工具,如`ExecutorService`、`Future`等。 - **网络编程**:`java.net`包提供了网络通信的基本功能,如Socket、ServerSocket等。 - **...
3. **并发编程**:`java.util.concurrent`包提供了丰富的并发工具类,如`ExecutorService`、`Future`、`Semaphore`、`CyclicBarrier`等,以及`ConcurrentHashMap`这种线程安全的映射结构。 4. **NIO(非阻塞I/O)**...
开发者可以通过继承`Thread`类或者实现`Runnable`接口来创建并管理线程,`java.util.concurrent`包则提供了高级并发工具,如`ExecutorService`、`Semaphore`和`Future`。 5. **网络编程**: `java.net`包提供了...
3. **锁**:Java并发库中的`java.util.concurrent.locks`包提供了更高级的锁机制,如可重入锁(`ReentrantLock`)、读写锁(`ReadWriteLock`)和条件变量(`Condition`),这些工具允许更灵活的控制并发访问。 4. **并发...