`

java的concurrent/java.util.concurrent.locks用法详解

    博客分类:
  • lock
阅读更多

java.util.concurrent.locks - 内容部份


Lock 接口支持那些语义不同(重入、公平等)的锁定规则 ,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁定重排算法)中使用这些规则。主要的实现是 ReentrantLock。

ReadWriteLock 接口以类似方式定义了一些读取者可以共享而写入者独占的锁定 。此包只提供了一个实现,即 ReentrantReadWriteLock,因为它适用于大部分的标准用法上下文。但程序员可以创建自己的、适用于非标准要求的实现。

Condition 接口描述了可能会与锁定有关联的条件变量。这些变量 在用法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版本中的不同。

AbstractQueuedSynchronizer 类是一个非常有用的超类 ,可用来定义锁定以及依赖于排队阻塞线程的其他同步器。LockSupport 类提供了更低级别的阻塞和解除阻塞支持 ,这对那些实现自己的定制锁定类的开发人员很有用。

 

--------------------------------------------------------------------------------------------------------------------------

在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然 没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、 notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用 一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK1.5出现之后,Sun大神(Doug Lea)终于为我们这些可怜的小程序员推出了java.util.concurrent工具包以简化并发完成。开发者们借助于此,将有效的减少竞争条件 (race conditions)和死锁线程。concurrent包很好的解决了这些问题,为我们提供了更实用的并发程序模型。

Executor                  :具体Runnable任务的执行者。
ExecutorService           :一个线程池管理者,其实现类有多种,我会介绍一部分。我们能把Runnable,Callable提交到池中让其调度。
Semaphore                 :一个计数信号量
ReentrantLock             :一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。
Future                    :是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程。
BlockingQueue             :阻塞队列。
CompletionService         : ExecutorService的扩展,可以获得线程执行结果的
CountDownLatch            :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier             :一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
Future                    :Future 表示异步计算的结果。
ScheduledExecutorService :一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
接下来逐一介绍
Executors主要方法说明
newFixedThreadPool 固定大小线程池)
创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程(只有要请求的过来,就会在一个队列里等待执行)。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。
newCachedThreadPool (无界线程池,可以进行自动线程回收)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
newSingleThreadExecutor (单个后台线程)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
这些方法返回的都是ExecutorService对象,这个对象可以理解为就是一个线程池。
这个线程池的功能还是比较完善的。可以提交任务submit()可以结束线程池shutdown()。

01 import java.util.concurrent.ExecutorService;
02 import java.util.concurrent.Executors;
03 public class MyExecutor extends Thread {
04 private int index;
05 public MyExecutor( int i){
06      this .index=i;
07 }
08 public void run(){
09      try {
10       System.out.println( "[" + this .index+ "] start...." );
11       Thread.sleep(( int )(Math.random()* 1000 ));
12       System.out.println( "[" + this .index+ "] end." );
13      }
14      catch (Exception e){
15       e.printStackTrace();
16      }
17 }
18 public static void main(String args[]){
19      ExecutorService service=Executors.newFixedThreadPool( 4 );
20      for ( int i= 0 ;i< 10 ;i++){
21       service.execute( new MyExecutor(i));
22       //service.submit(new MyExecutor(i));
23      }
24      System.out.println( "submit finish" );
25      service.shutdown();
26 }
27 }

 

分享到:
评论

相关推荐

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

    《深入Synchronized与java.util.concurrent.locks.Lock的区别详解》 Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与...

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。...java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。

    javafxHtml编辑器.doc

    ava.util.concurrent.atomic java.util.concurrent.locks java.util.function java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi

    java SE API

    java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.zip javax.accessibility javax.activity javax.crypto javax.crypto.interfaces javax.crypto....

    java7rt.jar源码-JVM:JVM学习笔记

    java.util.locks java.util.atomic 进程/线程 并发/并行 线程 package com.ntuzy.juc_01 ; import java.util.concurrent.Callable ; import java.util.concurrent.ExecutionException ; import java.util.concurrent...

    基于线程池的Java多线程应用技术.pdf

    Java提供了两种方式实现线程同步机制,分别是使用synchronized关键字和java.util.concurrent.locks.Lock接口。 线程池的应用: 线程池技术可以应用于Web服务系统中,控制服务器系统的最大并发数与最多处理的任务数...

    Javase-6.0_中文API_HTML(最新更新)

    java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax.activity javax.annotation ...

    jdk 中文版

    java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax.activity javax.annotation ...

    Redis客户端Redisson.zip

    java.util.SortedSet 分布式 java.util.Queue 分布式 of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 ...

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

    `java.util.concurrent.locks.Condition` 接口与 `java.util.concurrent.locks.Lock` 接口一起使用,提供了比`synchronized`更细粒度的控制。Lock提供了获取和释放锁的方法,而Condition则允许线程等待特定条件并被...

    java的concurrent用法详解

    ### Java的Concurrent包用法详解 #### 一、引言 在Java 1.5之前,为了实现多线程的并发操作,开发者通常需要手动编写复杂的代码来处理线程间的同步问题,如使用`synchronized`关键字、`wait()`与`notify()`方法等。...

    JAVA_API1.6文档(中文)

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

    java 资源搜索并下载(线程等待和通报)

    Java的`java.util.concurrent.locks.Condition`接口提供了这一功能。线程可以通过`await()`方法进入等待状态,直到收到`signal()`或`signalAll()`通知后唤醒。这在资源下载完成后更新进度或通知用户时非常有用。 五...

    java并发编程实战范例(由浅入深代码范例和详细说明)(合集).docx

    3. 使用`ReentrantLock`:如果需要更细粒度的锁控制,可以使用`java.util.concurrent.locks.ReentrantLock`,它提供了公平锁和非公平锁的选择,以及可中断和定时等待的特性。 4. 使用`ConcurrentHashMap`:在并发...

    操作系统模拟:读写者问题

    import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriter { private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final SharedResource resource; public ...

    concurrent-1.3.4-sources.jar

    4. **java.util.concurrent.locks** 包:这个包提供了高级锁机制,包括ReentrantLock、ReadWriteLock等。ReentrantLock可重入锁比内置的synchronized更灵活,提供了公平性和非公平性选择,以及尝试锁定、定时锁定...

    28个java常用的工具类

    23. **`java.util.concurrent.locks.Lock`** 和 **`java.util.concurrent.locks.ReentrantLock`**: 锁机制,用于线程同步。 24. **`java.util.ArrayList`**: 用于创建堆栈、队列和双端队列的实现,如`ArrayDeque`。...

    java多线程控制的赛跑程序

    import java.util.concurrent.locks.ReentrantLock; class Runner implements Runnable { private final Lock startLine = new ReentrantLock(); @Override public void run() { startLine.lock(); // 获取锁 ...

    JAVA Concurrent Programming

    4. `java.util.concurrent.locks`包 此包包含各种锁实现,如`ReentrantLock`(可重入锁)、`ReadWriteLock`(读写锁)和`Condition`(条件变量)。这些锁机制提供了更灵活的同步控制,比如读写锁允许多个读线程同时...

    Java语言ReadWriteLock特性实例测试

    Java中的ReadWriteLock接口是Java并发包`java.util.concurrent.locks`中的一个重要组件,它提供了比单个锁更复杂的锁定机制。ReadWriteLock接口定义了两个锁:ReadLock(读锁)和WriteLock(写锁)。这种设计允许多...

Global site tag (gtag.js) - Google Analytics