Java并发AtomicReferenceArray类】的更多相关文章

java.util.concurrent.atomic.AtomicReferenceArray类提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作. AtomicReferenceArray支持对底层引用数组变量的原子操作. 它具有获取和设置方法,如在变量上的读取和写入. 也就是说,一个集合与同一变量上的任何后续获取相关联. 原子compareAndSet方法也具有这些内存一致性功能. AtomicReferenceArray方法 以下是AtomicReferenceArra…
Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html 官方API. CountDownLatch能够使一个或多个线程等待其他线程完成各自的工作后再执行:CountDownLatch是JDK 5+里面…
本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解的 CountDownLatch 作用 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他一个或者多个线程的操作执行完后再执行. 单词Latch的中文翻译是门闩,也就是有"门锁"的功能,所以当门没有打开时,N个人是不能进入屋内的,也就是N个线程是不能继续往…
1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行.当然,使用线程间消息通信机制也可以完成.其实,java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的这种业务场景. 为了能够理解CountDownLatch,举一个很通俗的例子,运动员进行跑步比赛时,…
Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pair of classes in which a group * of worker threads use two countdown latches: * <ul> * <li>The first is a start signal that prevents any worker…
前言 为保证计数器中count=+1的原子性,我们在前面使用的都是synchronized互斥锁方案,加锁独占访问的方式未免太过霸道,于是我们来介绍另一种解决原子性问题的无锁方案:原子变量.在正式介绍原子变量之前,我们先来总结下锁的不足,然后深入介绍原子变量. 锁的劣势 通过对共享变量加锁,使得获取到锁的线程可以采用独占方式来访问共享变量,并且对变量的修改对随后获取这个锁的其他线程都是可见的(Happens-Before规则). 当多个线程同时请求锁时,对于没有获取到锁的线程将有可能被挂起并且在…
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下. CountDownLatch CountDownLatch 概念 CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行. CountDownL…
简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方. Exchanger的应用场景 1.Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时…
作用 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行 简介 CountDownLatch是在java1.5被引入的,存在于java.util.concurrent包下,它允许1个或者多个线程一直等待,直到一组操作执行完成. CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量,此值是线程将要等待的操作数(线程的数量).当某个线程为了想要执行这些操作而等待时, 它要使用 await()方法.此方法让线程进入休…
一.简介 1.1. Semaphore 信号量,见文知义,常用于并发控制中的限流作用,我理解是限定数量的共享锁机制.该共享资源最多同时可让n个线程访问,超过n个线程就阻塞等待,如有资源空闲, 唤醒其他等待线程(唤醒又分公平与非公平,默认非公平)比如一条四车道大桥,每次仅能并发通过4辆汽车,而在高峰期时100辆车涌入,这次需要一个信号灯来限制车辆,每次最多放行4辆车,在车辆通过后再放行.在并发环境下,每辆车就是如一个线程,4车道大桥就如有限的资源,需要控制线程的数量,在这种业务场景下,靠锁同步的机…
主要有两类 ①并发流程控制相关:CountDownLatch.CyclicBarrier.Semaphore ②线程间交换数据相关:Exchanger: CountDownLatch 作用:允许一个或多个线程等待其他线程完成操作 使用步骤: ①定义一个CountDownLatch(称为计数器),并指定等待次数: ②在合适的时机将计数器减1: ③在需要等待所有任务结束的位置,调用await()方法: 根据JDK中的说明文档整理的两个例子: 例子1: public class CountDownLa…
CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行: 确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 等待直到某个操作所有参与者都准备就绪再继续执行. CountDownLatch有一个正数计数器,count…
前言 1965年,荷兰计算机科学家Dijkstra提出的信号量机制成为一种高效的进程同步机制.这之后的15年,信号量一直都是并发编程领域的终结者.1980年,管程被提出,成为继信号量之后的在并发编程领域的第二个选择.目前几乎所有的语言都支持信号量机制,Java也不例外.Java中提供了Semaphore并发工具类来支持信号量机制.下面我们就来了解Java实现的信号量机制. 首先介绍信号量模型,然后介绍如何使用,最后使用信号量来实现一个限流器. 信号量模型 信号量模型图(图来自参考[1]): 信号…
前言 前面介绍过ReentrantLock,它实现的是一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock.这是一种强硬的加锁规则,在某些场景下会限制并发性导致不必要的抑制性能.互斥是一种保守的加锁策略,虽然可以避免"写/写"冲突和"写/读"冲突,但是同样也避免了"读/读"冲突. 在读多写少的情况下,如果能够放宽加锁需求,允许多个执行读操作的线程同时访问数据结构,那么将提升程序的性能.只要每个线程都能确保读到最新的数据,并且在读…
前言 下面介绍协调让多线程步调一致的两个工具类:CountDownLatch和CyclicBarrier. CountDownLatch和CyclicBarrier的用途介绍 CountDownLatch // API void await(); // 使当前线程在闭锁计数器到零之前一直等待,除非线程被中断. boolean await(long timeout, TimeUnit unit); // 使当前线程在闭锁计数器至零之前一直等待,除非线程被中断或超出了指定的等待时间. void co…
前言 Java并发包有很大一部分都是关于并发容器的.Java在5.0版本之前线程安全的容器称之为同步容器.同步容器实现线程安全的方式:是将每个公有方法都使用synchronized修饰,保证每次只有一个线程能访问容器的状态.但是这样的串行度太高,将严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低.因此,在Java 5.0版本时提供了性能更高的容器来改进之前的同步容器,我们称其为并发容器. 下面我们先来介绍Java 5.0之前的同步容器,然后再来介绍Java 5.0之后的并发容器. Ja…
本文部分摘自<Java 并发编程的艺术> CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作.假设现有一个需求:我们需要解析一个 Excel 里多个 sheet 的数据,此时可以考虑使用多线程,每个线程解析一个 sheet 的数据,等到所有的 sheet 都解析完之后,程序需要提示解析完成.在这个需求中,要实现主线程等待所有线程完成 sheet 的解析操作,最简单的做法就是使用 join() 方法 public class JoinCountDo…
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数. 主要方法摘要: void acquire():从此信号量获取一个许可,在提供一个许可前翼子将线程阻塞,否则线程被中断. void release():释放一个许可,将其返回给信号量. in…
作用 CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point),才继续执行. 简介 CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活.CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数…
以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中的方法 转载原文链接:http://www.cnblogs.com/dolphin0520/p/3920357.html 一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocke…
前言 ReadWriteLock适用于读多写少的场景,允许多个线程同时读取共享变量.但在读多写少的场景中,还有更快的技术方案.在Java 1.8中, 提供了StampedLock锁,它的性能就比读写锁还要好.下面我们介绍StampedLock的使用方法.内部工作原理以及在使用过程中需要注意的事项. StampedLock支持的三种锁模式 ReadWriteLock支持两种访问模式:读锁和写锁,而StampedLock支持三种访问模式:写锁.悲观读锁和乐观读. 其中写锁和悲观读锁的语义与ReadW…
转自:https://www.jianshu.com/p/3632a0f9f083 线程不安全的高并发实现 客户端模拟执行 5000 个任务,线程数量是 200,每个线程执行一次,就将 count 计数加 1,当执行完以后,打印 count 的值. package atomic; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.con…
CountDownLatch允许一个或则多个线程等待其他线程完成操作. 假如我们有这样的需求:我们需要解析一个excel文件中的多个sheet,我们可以考虑使用多线程,每一个线程解析excel中的一个sheet表格,等所有的线程都完成解析之后,程序提示解析完成,输出解析结果.要实现这个需求,最简单的方式是使用Thread类的join方法,等待所有的线程都完成解析之后再提示解析完成,我们可以用一下代码完成解析: public class ReadExcelSheetsUserThreadJoinT…
java.util.concurrent.atomic.AtomicIntegerArray类提供了可以以原子方式读取和写入的底层int数组的操作,还包含高级原子操作. AtomicIntegerArray支持对底层int数组变量的原子操作. 它具有获取和设置方法,如在变量上的读取和写入. 也就是说,一个集合与同一变量上的任何后续get相关联. 原子compareAndSet方法也具有这些内存一致性功能. 序号 方法 描述 1 public int addAndGet(int i, int de…
java.util.concurrent.atomic.AtomicLongArray类提供了可以原子读取和写入的底层long类型数组的操作,并且还包含高级原子操作. AtomicLongArray支持对基础long类型数组变量的原子操作. 它具有获取和设置方法,如在变量上的读取和写入. 也就是说,一个集合与同一变量上的任何后续获取相关联. 原子compareAndSet方法也具有这些内存一致性功能. AtomicLongArray类中方法 以下是AtomicLongArray类中可用的重要方法…
java.util.concurrent.atomic.AtomicReference类提供了可以原子读取和写入的底层对象引用的操作,还包含高级原子操作. AtomicReference支持对底层对象引用变量的原子操作. 它具有获取和设置方法,如在易变的变量上的读取和写入. 也就是说,一个集合与同一变量上的任何后续get相关联. 原子compareAndSet方法也具有这些内存一致性功能. AtomicReference类的方法 以下是AtomicReference类中可用的重要方法的列表. 点…
java.util.concurrent.atomic.AtomicBoolean类提供了可以原子读取和写入的底层布尔值的操作,并且还包含高级原子操作. AtomicBoolean支持基础布尔变量上的原子操作. 它具有获取和设置方法,如在volatile变量上的读取和写入. 也就是说,一个集合与同一变量上的任何后续get相关联. 原子compareAndSet方法也具有这些内存一致性功能. AtomicBoolean类中的方法 以下是AtomicBoolean类中可用的重要方法的列表. 序号 方…
Fork/Join 分而治之 将一个大任务分成数个小任务执行,然后将这些小人物执行后的结果进行join汇总: (假设:你要计算1到1000的总和,你可以把它分成1-100,101-200,......,901-1000几组完成,然后再把这几组的结果相加) 工作窃取 有一个较大的任务划分成了10个小任务. 这10个小任务在一个大小为2的线程池中执行. 线程池中的2个核心线程,每个线程的队列中有5个任务. 线程1的任务都很简单,所以它很快就将5个任务执行完毕. 线程2的任务都很复杂,当线程1执行完5…
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Semaphore * Semaphore维护者一组权限,无实体权限,只是一组代表权限的数字, * 每一次执行acquire都会被阻塞,直到获取获取权限, * 每一次执行release都会释放权限,唤醒阻塞acquire线程 * * Semaphore通常应用于限制资源访问 * * * Created by w…
ReentrantLock内部由Sync类实例实现. Sync类定义于ReentrantLock内部. Sync继承于AbstractQueuedSynchronizer. AbstractQueuedSynchronizer继承于AbstractOwnableSynchronizer. AbstractOwnableSynchronizer类中只定义了一个exclusiveOwnerThread变量,表示当前拥有的线程. 除了Sync类,ReentrantLock内部还定义了两个实现类. No…