![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java.util.concurrent
业务架构实验室
在程序的世界里,你永远不会成为最懂的那个人,因为你总是能从不同的人身上学习到你所不知道的知识
展开
-
BlockingQueue
package concurrentTest; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class TestBlockingQueue { public static void m原创 2015-09-23 11:04:42 · 365 阅读 · 0 评论 -
CompletionService
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果。为此你可以保存与每个任务相关联的Future,然后不断地调用timeout为零的get,来检验Future是否完成。这样做固然可以,但却相当乏味。幸运的是,还有一个更好的方法:完成服务(Completion service)。 CompletionService整合了Executor和BlockingQueue的功能转载 2015-09-25 11:54:27 · 383 阅读 · 0 评论 -
ForkJoinPool
介绍 随着多核芯片逐渐成为主流,大多数软件开发人员不可避免地需要了解并行编程的知识。而同时,主流程序语言正在将越来越多的并行特性合并到标准库或者语言本身之中。我们可以看到,JDK 在这方面同样走在潮流的前方。在 JDK 标准版 5 中,由 Doug Lea 提供的并行框架成为了标准库的一部分(JSR-166)。随后,在 JDK 6 中,一些新的并行特性,例如并行 collection 框转载 2015-09-24 17:27:16 · 768 阅读 · 0 评论 -
JDK中的位操作
在看JDK某些类和方法时经常会看到这样的位操作源码,初看很费解,仔细想想才琢磨出了这样做的目的: if (n >= MAX_ID) n = MAX_ID;//MAX_ID=0x7fff else { n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; } 这个操作其实是让一个大于MAX_ID的值直接等于MAXID,而让一个小于MA原创 2015-09-24 15:52:49 · 405 阅读 · 0 评论 -
SynchronousQueue
package concurrentTest; import java.util.Arrays; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.SynchronousQueue; public class TestSynchronousQueue {原创 2015-09-23 11:35:48 · 504 阅读 · 0 评论 -
DelayQueue
package concurrentTest; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * Created by mashao on 15/9/23. */ public class TestD原创 2015-09-23 10:54:49 · 398 阅读 · 0 评论 -
ScheduledThreadPoolExecutor
自jdk1.5开始,Java开始提供ScheduledThreadPoolExecutor类来支持周期性任务的调度,在这之前,这些工作需要依靠Timer/TimerTask或者其它第三方工具来完成。但Timer有着不少缺陷,如Timer是单线程模式,调度多个周期性任务时,如果某个任务耗时较久就会影响其它任务的调度;如果某个任务出现异常而没有被catch则可能导致唯一的线程死掉而所有任务都不会再被调转载 2015-09-23 10:15:36 · 441 阅读 · 0 评论 -
Exchanger
Exchanger 用来在两个线程中交换数据,看下面的Test用例: package concurrentTest; import java.util.ArrayList; import java.util.concurrent.Exchanger; public class TestExchanger { public static void main(String[] args原创 2015-09-22 16:53:31 · 406 阅读 · 0 评论 -
Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕转载 2015-09-22 15:05:58 · 356 阅读 · 0 评论 -
CyclicBarrier
我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 Cycli转载 2015-09-22 12:33:53 · 396 阅读 · 0 评论 -
Semaphore
我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。” 我们一般用它来控制原创 2015-09-22 14:24:35 · 343 阅读 · 0 评论 -
CountDownLatch
我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数转载 2015-09-22 11:31:33 · 383 阅读 · 0 评论 -
重新认识Java线程的概念
Java Thread有几种状态? java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep原创 2015-10-22 14:00:39 · 476 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2015-10-22 00:00:03 · 457 阅读 · 0 评论 -
synchronized与volatile异同分析
synchronized用来对线程进行同步,在变量操作上来说,他有着和volatile相近的特性,那就是一个线程写入的数据 在其他线程眼里所看到的都是同一份数据。这就屏蔽了线程各自缓存的数据和主存数据不一致的影响。 但是他们2个也有不同的地方,那就是如果当前写入数据的值需要基于变量的前一个值时,volatile就会失效。 比如n = n+1; n++这种操作 他们并不是原子性的操作,首先你原创 2015-09-25 15:44:49 · 709 阅读 · 0 评论