JAVA 并发编程-线程同步工具类(十二)

本文主要介绍一些java线程同步工具类,并不进行具体讲解,当有需要时,可以再去结合实例学习。

信号灯(Semaphore)

应用场景举例:

例如公司的打卡系统,如果有一个打卡机,那么一次就只能有一个人打卡,其余的人就被阻塞住,打卡完以后就可由下一个人打卡。如果有3个打卡机,那么一次就允许3个人或者少于三个人打卡,其余的人就得等待打卡机空闲下来才能继续打卡。

结果:

已进入1个线程,还可进入2个

已进入2个线程,还可进入1个

已进入3个线程,还可进入0个

空余出1个

已进入4个线程,还可进入0个

已进入6个线程,还可进入0个

空余出0个

空余出1个

已进入5个线程,还可进入0个

空余出0个

已进入8个线程,还可进入0个

空余出1个

已进入7个线程,还可进入0个

已进入9个线程,还可进入0个

空余出0个

空余出1个

空余出3个

空余出3个

从打印结果可以看出,虽然一次可进入三个线程,但并不是要等三个线程全部空出来才可以进入其他线程。而是只要有一个空闲,等待的线程立刻补上。这和现实生活中的情景式多么相似阿。由此可见,信号灯用来控制线程是很人性化的。

障碍器(CyclicBarrier)

应用场景举例:

举个例子比如说公司接到一个项目(主线程),一部分人开发前台(线程1),一部分人开发后台(线程2),前台和后台不可能同时开发完成,但是只有前台和后台都开发完成了,才能提交给客户。那么,CyclicBarrier所实现的就是对已完成任务的线程进行阻塞的功能。

结果:

前台正在开发!

后台正在开发!

前台开发完成

后台开发完成

两个项目组都已开发完成,进行测试。

测试通过,交付给客户

synchroized、Lock、Semaphroe都是对线程运行开始进行控制,而CyclicBarrier是对线程的完成进行控制

同步计数器(countDownLatch)

应用场景举例:

作用是在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

结果:

准备开始!

运动员7号到达终点!

运动员9号到达终点!

运动员6号到达终点!

运动员1号到达终点!

运动员3号到达终点!

运动员4号到达终点!

运动员0号到达终点!

运动员8号到达终点!

运动员2号到达终点!

运动员5号到达终点!

结束!

对比障碍器(CyclicBarrier)来说,障碍器只能控制线程的结束。但是计数器(CountDownLatch)可以通过多个计数器组合运用,既可以控制线程的开始,又可以控制线程的结束。

线程间数据交换(Exchanger)

应用场景举例:

所实现的功能是线程间的数据交换。但是需要注意的是,只能是两个线程的数据交换。

结果:

许阳拥有五元钱

商店拥有beverage

开始交易......

商店得到:五元钱

许阳得到beverage

总结:

以上都是一些线程的同步工具类,它们各有各的应用场景,在并发编程中,我们可以应用这些工具来更好的实现我们的业务需求。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 09:36:07

JAVA 并发编程-线程同步工具类(十二)的相关文章

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

java并发编程之五、工具类

java在线程同步和互斥方面在语言和工具方面都提供了相应的支撑,与此同时,java还提供了一系列的并发容器和原子类,来使得并发编程更容易. 一.并发容器 (一).同步容器 同步容器指的是容器本身使用synchronized关键字来同步访问,包括我们都知道的HashTable,也包括Vector和Stack.另外,也可以通过工具类Collections.synchronizedList(List<T> list)这个方法将线程不安全的ArrayList转成线程安全的包装类,其他的set,map等

【java并发】线程同步工具CyclicBarrier的使用

上一节中总结了Semaphore同步工具的使用,Semaphore主要提供了一个记数信号量,允许最大线程数运行.CyclicBarrier是另一个同步工具,这一节主要来总结一下CyclicBarrier的使用.先看一下官方的对CyclicBarrier的介绍: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用.因为该 barrier

【java并发】线程同步工具Semaphore的使用

Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,我们可以自己设定最大访问量.它有两个很常用的方法是acquire()和release(),分别是获得许可和释放许可.  官方JDK上面对Semaphore的解释是这样子的 : 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可.每个release()添加一个许可,从而可能释放一个正在阻塞的获取者.但是,不使用实际的许可对象,Semaphore 只对可用

【java并发】线程同步工具Exchanger的使用

如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象. 每次只能两个线程交换数据,如果有多个线程,也只有两个能交换数据.下面看个通俗的例子:一手交钱一首交货! public class ExchangerTest { public static void m

java并发编程线程安全

编写线程安全的代码实质就是管理对状态的访问,而且通常是共享的.可变的状态,对象的状态就是数据,存储在状态变量中,比如实例域,或者静态域,同时还包含了其它附属的域,例如hashmap的状态一部分存储到对象本身中,但同时也存储到很多mqp.entry中对象中,一个对象的状态还包含了任何会对他外部可见行为产生影响的数据. 所谓共享是指一个对象可以被多个线程访问, 所谓可变:是指变量的值在其生命周期内可以改变, 真正目的:在不可控制的并发访问中保护数据 线程安全必要条件: 1:对象是否被两个或以上的线程

Java并发编程:同步容器

为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. 以下是本文的目录大纲: 一.为什么会出现同步容器? 二.Java中的同步容器类 三.同步容器的缺陷 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3933404.html 一.为什么会出

Java并发编程-线程的并发工具类

Fork-Join 什么是分而治之?规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解动态规范工作密取workStealing Fork/Join使用的标准范式 常用的并发工具类CountDownLatch作用:是一组线程等待其他的线程完成工作以后在执行,加强版joinawait用来等待,countDown负责计数器的减一CyclicBarrier让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏

JAVA - 并发编程 - 线程安全方案

本文主要介绍 java中在并发环境下,有哪些方案实现线程安全,注意 线程问题主要由内存模型引起的(在基础篇中) 目录 valotile可见性 CAS无锁编程 内置锁(同步关键字synchronied) 显示锁(lock) valotile可见性 1 volatile关键字的两层语义(一旦一个共享变量被volatile修饰) 1.1 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其它线程来说是可见的 1.2 禁止进行指令冲排序 2 实现原理(加lock前缀,进行