`
yangzb
  • 浏览: 3500125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Util.concurrent工具包概述

    博客分类:
  • Java
阅读更多

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.util.concurrent系列文章(1)

    Java 5 引入了 `java.util.concurrent` 包,该包提供了丰富的 API 来简化并发编程任务。本篇文章将深入探讨 `java.util.concurrent` 包中的一些核心概念和技术,特别是 `ConcurrentHashMap` 和 `...

    The java.util.concurrent Synchronizer Framework

    Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...

    28个java常用的工具类

    以下是28个Java开发者经常使用的工具类的概述,这些工具类涵盖了广泛的用途: 1. **`java.util.Arrays`**: 这个类提供了对数组进行排序、查找、复制等操作的方法,如`Arrays.sort()`用于排序数组,`Arrays.asList()...

    java多线程编程总结

    - `java.util.concurrent.locks`包提供了多种类型的锁,如`ReentrantLock`等。 ##### 4. 信号量 - `java.util.concurrent.Semaphore`用于控制对有限资源的访问。 ##### 5. 阻塞队列 - `java.util.concurrent....

    java工具类

    11. **`java.util.concurrent`** 包:包含并发和多线程工具,如`ExecutorService`、`Future`和`Callable`。 12. **`java.util.logging.Logger`**:日志记录工具,用于输出程序运行时的信息。 13. **`java.lang....

    第20章 Part4 并发工具同步器.pdf

    综上所述,`java.util.concurrent`包提供的并发工具极大地简化了并发编程的复杂性,使得开发者可以更轻松地编写出高性能、可维护的并发应用程序。通过对这些工具的深入理解与合理运用,可以有效提高软件系统的并发...

    开发必读:如何成为一名优秀的Android开发者.pdf

    虽然Java标准库中的`java.util.concurrent`包提供了强大的并发编程工具,但鉴于Android设备的性能限制和框架本身提供的Task机制,如`AsyncTask`,直接使用`java.util.concurrent`中的类(如`ExecutorService`、`...

    Concurrent In java

    Java平台提供了丰富的并发编程工具,其中`java.util.concurrent`包尤其引人注目。这个包包含了多种并发容器和实用工具,能够帮助开发者轻松地编写出高性能且可维护的并发应用程序。本文将深入探讨`java.util....

    javaAPI1.6

    `java.lang.Thread`类允许创建和管理线程,而`java.util.concurrent`包则提供了高级并发工具,如`ExecutorService`、`Future`和`Semaphore`,帮助开发者更好地控制并发执行的线程。 4. **异常处理**:Java的异常...

    JAVA_API1.6文档(中文)

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    Master concurrency programming java 9 2nd.pdf

    - **`java.util.concurrent`包**:包含了大量用于实现并发编程的类,如`ThreadPoolExecutor`、`ScheduledThreadPoolExecutor`、`CountDownLatch`、`CyclicBarrier`等。 - **`CompletableFuture`**:Java 8引入并在...

    全套JavaAPI

    `java.util.concurrent`包包含了高级并发工具,如`ExecutorService`、`Future`和`Semaphore`等,简化了并发编程的复杂度。 4. **网络编程**:`java.net`包提供了网络编程的基础组件,如`Socket`、`ServerSocket`和`...

    Java 5.0多线程编程

    1. **Concurrent 包**:Java 5.0 中新增了 `java.util.concurrent` 包,提供了许多高级的并发工具类,如 `ExecutorService`、`Future`、`Semaphore` 等,这些工具简化了线程管理和同步控制。 2. **原子操作类**:`...

    Java_api文档(英文)

    13. **并发工具**:`java.util.concurrent`包还包含一系列高级并发工具,如`Semaphore`用于控制并发访问,`CountDownLatch`和`CyclicBarrier`用于同步任务。 Java API文档详尽地涵盖了这些知识点和其他许多内容,是...

    jdk api 1.8中文版.zip

    - **并发编程**:`java.util.concurrent`包提供了线程安全的数据结构和高级并发工具,如`ExecutorService`、`Future`等。 - **网络编程**:`java.net`包提供了网络通信的基本功能,如Socket、ServerSocket等。 - **...

    java SE的jdk1.8 API文档 chm格式

    3. **并发编程**:`java.util.concurrent`包提供了丰富的并发工具类,如`ExecutorService`、`Future`、`Semaphore`、`CyclicBarrier`等,以及`ConcurrentHashMap`这种线程安全的映射结构。 4. **NIO(非阻塞I/O)**...

    Java api html完整中文版

    开发者可以通过继承`Thread`类或者实现`Runnable`接口来创建并管理线程,`java.util.concurrent`包则提供了高级并发工具,如`ExecutorService`、`Semaphore`和`Future`。 5. **网络编程**: `java.net`包提供了...

    java并发实战中文文档

    3. **锁**:Java并发库中的`java.util.concurrent.locks`包提供了更高级的锁机制,如可重入锁(`ReentrantLock`)、读写锁(`ReadWriteLock`)和条件变量(`Condition`),这些工具允许更灵活的控制并发访问。 4. **并发...

Global site tag (gtag.js) - Google Analytics