Java Concurrent包初探】的更多相关文章

同步容器: Vector/Hashtable:jdk1.0就已经存在,jdk1.2改写实现List/Map接口.作为ArrayList/HashMap在并发场景中的替代类出现.注意:Hashtable的API中已经建议用ConcurrentHashMap替代Hashtable. SynchronizedSet/SynchronizedMap/SynchronizedList:Collections类生成的实现Set/Map/List接口的线程安全类,通过声明互斥锁,为所有线程不安全的操作加锁.注…
java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完 成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java多线程并发程序设计时,为防 止死蹦等现象的出现,比如使用java之前的wait().notify()和synchronized等,每每需要考虑性能.死锁.公平性.…
一.概述 在很多系统中,往往需要将各种操作写入数据库(比如客户端发起的操作). 最简单的做法是,封装一个公共的写日志的api,各个操作中调用该api完成自己操作日志的入库.但因为入数据库效率比较低,如果每个操作自己入库,则会影响响应速度.而且当操作并发度很高时,往往同时有多个线程在写数据库,也会对系统有影响. 考虑的解决方案是,这个api并不实际完成入库,而是将每个操作日志信息写到一个公共的缓存中,然后应用系统起了一个独立的线程(一直运行)在后台进行入库.如果当前缓存中有记录,就写库,没有记录,…
一.介绍 ExecutorService是java.util.concurrent包中的一个线程池实现接口.其有两个实现类: 1)ThreadPoolExecutor:普通线程池通过配置线程池大小,能有效管理线程的调度,在执行大量异步线程时提高程序的性能. /** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param corePoolSize the number of…
  由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式:   A线程写volatile变量,随后B线程读这个volatile变量. A线程写volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量.   Java的CAS会使用现代处…
一.BlockingQueue概述 1.阻塞的含义 BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: ,当一个线程对已经满了的阻塞队列进行入队操作时会阻塞,即线程会挂起直到队列不满时,线程才继续入队 当一个线程对一个空的阻塞队列进行出队操作时也会阻塞,即线程会挂起直到队列不空,线程才继续出队 2.为什么要使用BlockingQueue 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”…
一.概述 Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据.这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据. 二.示例程序 package exchanger.demo; import java.util.concurrent.Exchanger;…
一.Semaphore 是什么  信号量Semaphore是一个并发工具类,用来控制可同时并发的线程数,其内部维护了一组虚拟许可,构造函数初始化的时候可以指定许可的总数量 每次线程执行操作时先通过acquire方法获得许可,线程获得许可后Semaphore 的许可数量会减1,执行完毕再通过release方法释放许可,emaphore 的许可数量会加1.如果无可用许可,那么acquire方法将一直阻塞,直到其它线程释放许可.主要方法: Semaphore(int permits): 构造方法,创建…
一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 比如下面的代码片段:第一个lock没有unlock,就再次获取了lock private Lock lock = new ReentrantLock(); lock.lock(); 执行一段代码 lock.lock(); 再行执行一段代码…
一.CountDownLatch CountDownLatch一个线程同步的工具,是的一个或者多个线程等待其他线程操作完成之后再执行. CountDownLatch通过一个给定的数值count来进行初始化,方法await()一直阻塞直到当前的count到达零为止,count的数值通过countDown()方法来减1,count的数值一旦设定就不能再修改,如果需要进行修改,请考虑使用CyclicBarrier. 大体看了一下源代码,是通过同步队列来作为计数器来进行控制的.同步队列是在CountDo…
CountDownLatch 跟join的区别 CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a.b.c; 那么我们可以实现在a阶段完成后(在a阶段后 ,b.c阶段之前, latch.countDown();),就可以往下运行,主线程并不用等子线程把b.c阶段都跑完. latch.countDown() 其实是state -1 操作,latch.await() 其实一直在判断state == 0 如果为0就不再等待向下执行,基于AQ…
我们平时写程序需要经常用到集合类,比如ArrayList.HashMap等,但是这些集合不能够实现并发运行机制,这样在服务器上运行时就会非常的消耗资源和浪费时间,并且对这些集合进行迭代的过程中不能进行操作,否则会出现错误,例如下面程序: [Java]  public class CollectionModifyExceptionTest {      public static void main(String[] args) {          Collection users = new…
(注意:以下讲解的ConcurrentHashMap是jdk 1.8的) 一.ConcurrentHashMap的数据结构 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了. 首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构.而对于锁的粒度,调整为对每个数组元素加锁(Node). 然后是定位节点的hash算法被简化了,这样带来的弊端是Hash冲突会加剧.因此在链表节点数量大于8时,会将链表转化为红黑树进行存储. 用内置锁s…
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合,代表一种队列集合实现. JDK1.5版本中,加入java.uill.concurrent包,其中包含集合的线程安全方式的实现.本文仅探讨concurrent包下面的Collection接口实现. 目录 1. concurrent包下面Collection子接口.类框架图2. CopyOnWriteA…
很久之前人们为了继续享用并行化带来的好处而不想使用进程,于是创造出了比进程更轻量级的线程.以linux为例,创建一个进程需要申请新的自己的内存空间,从父进程拷贝一些数据,所以开销是比较大的,线程(或称轻量级进程)可以和父进程共享内存空间,让创建线程的开销远小于创建进程,于是就有了现在多线程的繁荣. 但是即便创建线程的开销很小,但频繁创建删除也是很浪费性能的,于是人们又想到了线程池,线程池里的线程只会被创建一次,用完也不会销毁,而是在线程池里等待被重复利用.这种尤其适用于多而小的任务.举个极端点的…
------------------------------------------java util 下的concurrent包--------并发包--------------------.java.util.concurrent他下面的接口摘要:    1.ThreadFactory    2.RunnableFuture<V>    3.Executor    4.ExecutorService    5.ConcurrentMap<K,V>    6.BlockingQu…
在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Executor.ExecutorService框架 从Executor接口开始,到ExecutorService,再到很多基于ThreadPoolExecutor实现的具体执行器.执行器实际上是采用了一种叫做命令模式的设计,将任务Runnable和具体执行线程相分离,并给出了生命周期等管理方法,一般只要e…
newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束,再继续执行下面的代码.该例中我设置一直等着子线程结束. Java代码 收藏代码 public class Test { public static void main(String[] args) throws IOException, InterruptedException { Executor…
<java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码,一边写文章. 由于水平有限,在阅读源代码的时候,分析得也比较浅显,还有很多地方自己也没有研究明白,有的地方显得语焉不详,只能请各位多多见谅了. 后面会继续写一些关于Java并发编程的文章,希望各位多多指教. 这里整理了一个简单的目录,包含了本系列所有文章的链接: <java.util.concurrent…
Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的AomicStampedReferrence,它不是AomicReferrence的子类,而是利用AomicReferrence实现的一个储存引用和Integer组的扩展类   首先,所有原子操作都是依赖于sun.misc.Unsafe这个类,这个类底层是由C++实现的,利用指针来实现数据操作   关…
Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:ConcurrentMap.本篇文章主要关注ConcurrentMap接口以及它的Hash版本的实现ConcurrentHashMap. ConcurrentMap是Map接口的子接口 public interface ConcurrentMap<K, V> extends Map<K, V>…
这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecut…
学过操作系统的朋友都知道信号量,在java.util.concurrent包中也有一个关于信号量的实现:Semaphore. 从代码实现的角度来说,信号量与锁很类似,可以看成是一个有限的共享锁,即只能被有限数量的线程使用的共享锁. 因为存在计数,因此Semaphore的构造函数有参数permits来设定计数: public Semaphore(int permits) { sync = new NonfairSync(permits); } 涉及到线程排队等待的问题,Semaphore也支持fa…
本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这些功能,但是这些框架依然没有JDK自带的功能使用起来方便. 而当针对高质量Java多线程并发程序设计时,比如使用Java之前的wait().notify()和synchronized等,需要考虑性能.死锁.公平性.资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策…
java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞.线程安全.FIFO 生产者.消费者场景比较合适,并且支持FIFO 2 Queue LinkedTransferQueue 阻塞.线程安全.FIFO LinkedTransferQueue实现了一个重要的接口TransferQueue,该接口含有下面几个重要方法: 1. transfer(E e):…
    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait().notify()和synchronized等,每每需要考虑性能.死锁.公平性.资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK…
类图: 其实从类图我们能发现concurrent包(除去java.util.concurrent.atomic 和 java.util.concurrent.locks)中的内容并没有特别多,大概分为四类:BlockingQueue阻塞队列体系.Executor线程组执行框架.Future线程返回值体系.其他各种单独的并发工具等. 首先学习的是Executor体系,是我们处理多线程最常接触的内容.首先我们单独看下继承体系: Executor是顶级接口,里面只有一个方法: public inter…
JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低.因此JDK5开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包.与Vector和Hashtable.Collections.synchronizedXxx()同步容器等相比,ut…
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合,代表一种队列集合实现. JDK1.5版本中,加入java.uill.concurrent包,其中包含集合的线程安全方式的实现.本文仅探讨concurrent包下面的Map接口实现. 1. concurrent包下面Map子接口.类框架图 2. ConcurrentMap接口.ConcurrentHa…
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start();       //thread类必须继承Thread ③Executor pool = Executors.newFixedThreadPool(7);pool.execute(new Runnable() ); //利用线程池 转载:http://blog.csdn.net/king866/arti…