`
michael.softtech
  • 浏览: 208795 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java里面的Synchronizers--Latch,Barrier,Semaphore,ReentrantLock,Condtion

阅读更多

昨晚闲来翻了一会Java ConcurrentCy in Practise,

进一步明确了java 一些 Synchronizers的用法,在此简单记录一下

昨日随手写的demo代码。只是为了加深印象,所以不怎么讲究,如有看官路过请不要挑剔:

 

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;


public class NightDinner {
	private Semaphore sem=new Semaphore(3);
	private CountDownLatch startLatch=new CountDownLatch(1);
	private CountDownLatch latch=new CountDownLatch(4);
	private CyclicBarrier barrier=new CyclicBarrier(2,new Runnable(){
		public void run() {
			System.out.println("barrier tripped");
			}});
    private ReentrantLock lock=new ReentrantLock();
    private Condition condition=lock.newCondition();
		
	public static void main(String[] args) {
		NightDinner nd=new NightDinner();
		nd.testLatch();
		nd.testBarrier();
		nd.testLock();
		nd.testSemaphore();
	}
	
	public void testLatch(){
		for(int i=0;i<4;i++){
			new Thread(new AThread()).start();
		}
		startLatch.countDown();
		System.out.println("latch begin");
		try {
			latch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("latch zero reached");
		
	}
	public void testBarrier(){
		for(int i=0;i<2;i++){
			new Thread(new BThread()).start();
		}
		
	}
	public void testLock(){
		for(int i=0;i<3;i++)
		new Thread(new CThread()).start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		lock.lock();
		//condition.signal();
		condition.signalAll();
		//要显式地释放掉lock的锁
		lock.unlock();
	}
	
	public void testSemaphore(){
		for(int i=0;i<4;i++)
		new Thread(new DThread()).start();
	}
	public class AThread implements Runnable{

		public void run() {
			try {
				startLatch.await();
			} catch (InterruptedException e) {
			}
			 latch.countDown();
			 System.out.println("latch down1");
		}
		
	}
	public class BThread implements Runnable{

		public void run() {
			try {
				System.out.println("barrier begints to await");
				barrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public class CThread implements Runnable{
		public void run() {
         	lock.lock();
         	try {
         		System.out.println("lock got.conditon begins to wait");
				//condition的wait方法将release当前线程持有的condtion相关的lock的锁,然后等待被唤醒
         		condition.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			finally{
				System.out.println("conditon signaled");
				lock.unlock();
			}
		}
		}
	public class DThread implements Runnable{

		public void run() {
			boolean suc=sem.tryAcquire();
			System.out.println("sem result:"+suc);
		}
		
	}
}

   总结一下,就是:

   CountdownLatch:

   一个主人线程一直await,知道所有客人线程都countdown并且latch的值为0,那么

   主人认为时机已成熟,开饭。

   CyclicBarrier:

   一桌有10个位子,人不满不能开席(定义cyclicbarrier的时候可选的runnable行为)。于是,来了一个(await),又来了一个...第10个来了,barrier发现时机已成熟,开饭。

   Semapore:

   一桌有10个位子。来了一个(acquire)..第10个来了....第11个来了....哈哈,没有位子了,站着吧

 

  ReentrantLock:

  这个官方文档可能读起来不是很顺畅,还是通过代码明白得更深入一些。

  一个lock可以有多个Condtion。每个Condtion都有一个管理的lock。

  Conditon可以await(释放掉关联的Lock的锁,等待notif),也可以notify(通知其他线程处于condtion await 状态的线程可以做好继续获取lock的锁的准备了。notify之后要显式地释放掉lock锁).

 

分享到:
评论
2 楼 michael.softtech 2012-12-27  
谢谢。好久没登录。等有时间补齐。
1 楼 姑苏痴情 2012-05-09  
试着用语言完整的描述下这个场景,你的例子会很有说服力。

相关推荐

    Android代码-java-concurrency-patterns

    Java Concurrency Patterns and Features Concurrency Patterns and features found in Java, through multithreaded programming. Features: Threads and Runnables Locks Intrinsic Explicit Reentrant Read...

    Java2核心技术卷I+卷2:基础知识(第8版) 代码

    Java 核心技术 卷1 Index Chapter 1: An Introduction to Java 1 Java As a Programming Platform 2 The Java “White Paper” Buzzwords 2 Java Applets and the Internet 7 A Short History of Java 9 ...

    java.核心技术.第八版 卷1

    java 核心技术 第八版 core 卷1 Core Java, 8th Edition Core Java. Volume I. Fundamentals, 8th Edition Core Java. Volume II. Advanced Features, 8th Edition 官方网站 http://horstmann.com/corejava.html ...

    java编发编程:JUC综合讲解

    Java并发编程中的JUC(Java Util Concurrent)库是开发者处理多线程问题的关键工具,尤其在多核处理器的环境中,其重要性不言而喻。JUC库包含了一系列的类和接口,帮助开发者构建高效、稳定的并发程序。下面将详细...

    Java Language Features 2nd Edition

    Java Language Features: With Modules, Streams, Threads, I/O, and Lambda Expressions Work with essential and advanced features of the Java programming language such as Java modules development, lambda ...

    Java.Threads.and.the.Concurrency.Utilities.1484216997

    This concise book empowers all Java developers to master the complexity of the Java thread APIs and concurrency utilities. This knowledge aids the Java developer in writing correct and complex ...

    Metastability and Synchronizers: A Tutorial

    亚稳态和同步器:教程 在数字电路设计领域,亚稳态和同步器是两个核心概念,尤其在处理时钟域交叉问题时尤为重要。亚稳态是指当触发器(Flip-Flop)的输入信号在时钟的采样边沿附近不稳定时,触发器无法在规定时间...

    JUC线程锁框架

    Java并发编程是Java平台的重要特性,它为多线程编程提供了强大的支持。JUC,全称为Java Util Concurrency,是Java并发包的简称,包含了大量用于处理并发问题的类和接口,极大地简化了多线程环境下的编程。在这个深度...

    Java Threads and the Concurrency Utilities(Apress,2015)

    This concise book empowers all Java developers to master the complexity of the Java thread APIs and concurrency utilities. This knowledge aids the Java developer in writing correct and complex ...

    Java.Concurrency.in.Practice.pdf

    本文档为《Java并发编程实践》(Java Concurrency in Practice)的电子版PDF文件,这本书由Brain Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes以及Doug Lea所著。该书详细探讨了Java语言中的...

    weblogic dump 学习

    WebLogic作为一款成熟的中间件产品,广泛应用于企业级Java EE应用的部署和管理。在WebLogic的日常运维中,监控和问题排查是非常重要的环节,而dump文件是分析WebLogic运行情况、排查问题的有力工具之一。本文档将...

    Clock Domain Crossing.pdf

    Synchronizers 的主要作用是将信号从一个时钟域同步到另一个时钟域,以确保信号正确地传输。Synchronizers 通常使用两个或三个 flip-flop 组成,用于同步信号。 两种同步场景 在 CDC 设计中,存在两种同步场景:...

    JUC-master

    4. **并发工具类(Synchronizers)**:包括CountDownLatch、CyclicBarrier、Semaphore等,它们提供了同步控制和协调不同线程间操作的能力。例如,CountDownLatch可以用于等待多个任务完成,CyclicBarrier则允许一组...

    算法与数据结构 分布式算法课程 第10章 同步化器 共39页.pdf

    - **同步化器(Synchronizers)**:一种特殊的分布式算法,用于在网络中实现同步。它通过限制网络的异步性来保持相邻节点之间的状态接近。 #### 二、模拟同步算法在异步网络中的应用 - **目的**:在异步网络环境中...

    FPGA设计软件quartus2使用教程

    -- pulses synchronizers for WRREQ and RDREQ -- modified for Synplify to a process ``` ##### 2.3 编译过程 - **编译**:通过Quartus II提供的编译功能对设计进行编译,确保代码没有语法错误并且符合逻辑...

    tivoli

    **Password Synchronizers** - **功能**: 用于执行实际的密码同步操作。 - **示例**: LDAP Password Synchronizer、RDBMS Password Synchronizer等。 - **优势**: 支持多种目标系统,可以根据具体需求选择合适...

    FPGA中FIFO的使用

    -- pulses synchronizers for WRREQ and RDREQ -- modified for Synplify to a process sync_ffs : process begin wait until rising_edge(CLOCK); Q1 ; Q2 ; Q3 ; Q4 ; end process; ``` - **同步进程**:该...

    AbstractQueuedSynchronizer.pdf

    Java大神Doug Lea对AQS的解析:Most synchronizers (locks, barriers, etc.) in the J2SE1.5 java.util.concurrent package are constructed using a small framework based on class AbstractQueuedSynchronizer. ...

    phaser_stampedlock_varhandle_tut

    移相器,冲压锁和VarHandle教程关于观看Heinz Kabutz的视频后记下的笔记: ... https://github.com/kabutz/modern-synchronizers : https://github.com/kabutz/modern-synchronize

Global site tag (gtag.js) - Google Analytics