Java线程与并发编程实践----同步器(倒计时门闩)

Java提供的synchronized关键字对临界区进行线程同步访问。由于基于synchronized很难

正确编写同步代码,并发工具类提供了高级的同步器。倒计时门闩(countdown latch)、同步屏

障(cyclic barrier)、交换器(exchanger)、信号量(semaphore)以及phaser同步器。下面主要

介绍倒计时门闩。

倒计时门闩会导致一条或多条线程在“门口”一直等待,直到另一条线程打开这扇门,线程

才得以继续运行。他是由一个计数变量和两个操作组成的,这两个操作分别是“导致一条线程等待直到

计数变为0”以及“递减计数变量”。

实现类:java.util.concurrent.CountDownLatch

以下代码是用倒计时门闩实现的一个是所有线程同时执行同时结束之后,才能继续执行主线程:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
	final static int NTHREADS = 3;
	public static void main(String[] args) {
		final CountDownLatch startSignal = new CountDownLatch(1);
		final CountDownLatch doneSignal = new CountDownLatch(NTHREADS);
		Runnable r = new Runnable() {

			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName() + "进入等待");
					startSignal.await();
					System.out.println(Thread.currentThread().getName() + "开始执行任务");
					Thread.sleep(200);
					doneSignal.countDown();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		ExecutorService es = Executors.newFixedThreadPool(NTHREADS);
		for (int i = 0; i < NTHREADS; i++) {
			es.execute(r);
		}
			try {
				Thread.sleep(1000);
				startSignal.countDown();
				System.out.println(Thread.currentThread().getName() + "进入等待");
				doneSignal.await();
				System.out.println(Thread.currentThread().getName() + "开始执行");
				es.shutdownNow();

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}
}

原文地址:http://blog.51cto.com/12222886/2061773

时间: 2024-08-29 23:55:01

Java线程与并发编程实践----同步器(倒计时门闩)的相关文章

Java线程与并发编程实践----同步器(交换器、信号量)

一.交换器 交换器提供了一个线程之间能够交换对象的同步点.每个线程都会往这个 交换器的exchange()方法传入一些对象,匹配伙伴线程,同时接受伙伴对象作为返 回值.java.util.conurrent.Exchange<V>实现了交换器. 下面是一个代码小实例: import java.util.concurrent.Exchanger;   import java.util.concurrent.ExecutorService;   import java.util.concurren

Java线程与并发编程实践----锁框架

Java.util.concurrent.locks包提供了一个包含多种接口和类的框架,它 针对条件进行加锁和等待.不同于对象的内置加锁同步以及java.lang.Object的等 待/通知机制,包含锁框架的并发工具类通过轮询锁.显示等待及其它方式改善这种 机制. 锁框架包含了经常使用的锁.重入锁.条件.读写锁以及冲入读写锁等类别. 一.锁(Lock) Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实 现允许更灵活的结构,可以具有差别很大的属性,可以

Java线程与并发编程实践----并发工具类与Executor框架

java5之前,我们使用诸如synchronized,wait(),notify()方法对线程的操作属于对 底层线程的操作,这样会出现很多的问题: 低级的并发原语,比如synchronized,wait(),notify()经常难以正确使用.误用会导致 竞态条件,线程饿死,死锁等风险. 泰国依赖synchronized会影响程序性能以及程序的可扩展性 开发者经常需要高级线程结构,如线程池,信号量.java对底层线程的操作不包含这些结. 为解决这些问题,java5引入并发工具类,该工具类主要有下面

Java线程与并发编程实践----额外的并发工具类

一.并发集合 java.util包下提供了很多的集合类,如ArrayList.TreeSet.HashMap,但是这些 集合都是非线程安全的,并且对于单列集合的迭代器,采用的是快速失败机制,当正在迭代 遍历的集合被其它线程修改时,便会抛出 java.util.ConcurrentModificationException. 这显然对于多线程操作的集合是十分不方便的,但早Colections这个工具类中有方法可以返回 线程安全的集合,然而这种集合对于高并发环境,性能十分低下. 于是,java.ut

java线程与并发编程实践(一)

一.给出线程的定义     线程就是一条在程序代码中独立执行的路径 二.给出runnable的定义 一个runnable就是一段封装在对象中的代码序列,它的类实现了runnable接口 三.Thread类和runnable接口完成了什么? 类Thread提供了一个底层操作系统的线程架构的统一接口.Runnable接口为关联了Thread对象的线程提供了执行代码. 四.指出创建一个Runnable对象的两种方式? 创建一个实现Runnable接口的匿名类或者lambda表达式 Runnable r

Java线程与并发编程实践----等待通知(生产者消费者问题)线程

Java提供了一套API来支持线程之间的交互.在Object类中提供了一套等待通知的API  wait()     notify()     notifyAll()     此处要注意的是,绝不要在循环外面调用wait()方法.(单独开一片文章来讨论)     下面使用消费者与生产者问题来展示以上API的使用: package xiancheng; public class PC { public static void main(String[] args) { Shared s = new 

[Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

根据<Java并发编程实践>一书整理的思维导图.

[Java 并发] Java并发编程实践 思维导图 - 第一章 简介

阅读<Java并发编程实践>一书后整理的思维导图.

读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例

在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public