随笔分类 -  Java并发编程

Java并发编程实践
摘要:本节我们从以上几个方面详细介绍一下Java线程池的使用。 线程池的创建 线程池任务提交 关闭线程池 线程池的监控 线程池的合理配置 一.线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池。 创建线程池需要输入几个参数: 1.corePoolSize(线程池的基本大小):当 阅读全文
posted @ 2017-11-25 15:59 木易森林 阅读(623) 评论(0) 推荐(0) 编辑
摘要:Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情: 1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进 阅读全文
posted @ 2017-11-25 15:19 木易森林 阅读(45312) 评论(4) 推荐(7) 编辑
摘要:happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键。 一.JMM的设计 首先,让我们先分析一下JMM的设计意图。从JMM的设计者的角度,在设计JMM的时候要考虑一下两个关键因素: 1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序 阅读全文
posted @ 2017-11-25 11:26 木易森林 阅读(6735) 评论(3) 推荐(0) 编辑
摘要:一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重排 阅读全文
posted @ 2017-11-25 10:58 木易森林 阅读(3431) 评论(1) 推荐(2) 编辑
摘要:提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,什么场景下会出现这个问题呢?查了一些资料,发现在下面的两种情况下会出现ABA问题。 1.A最开始的内存地址是X,然后失效了,有分配了B,恰好内存地址是X,这时候通过CAS操作,却设置成功了 这种情况在带有GC的语言 阅读全文
posted @ 2017-11-21 21:23 木易森林 阅读(5676) 评论(0) 推荐(0) 编辑
摘要:在多线程的并发编程中synchronized和volatile都扮演着重要的角色。volatile是轻量级的synchronized,它在多处理器的开发中保证了共享变量的可见性,可见性的意思是当一个线程修改一个共享变量时,另一个线程能够读取到这个修改值。如果volatile变量使用恰当的话,他会比s 阅读全文
posted @ 2017-11-21 20:59 木易森林 阅读(467) 评论(0) 推荐(0) 编辑
摘要:当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2。这是因为,可能在A线程和B线程执行的时候拿到的i的值都是1,这就是线程不安全的更新操作,通常我们会使用s 阅读全文
posted @ 2017-11-21 19:29 木易森林 阅读(15387) 评论(1) 推荐(1) 编辑
摘要:Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换。它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据。两个线程通过exchange方法交换数据,如果一个线程执行exchange方法,它就会等待另一个线程执行exchange方法,当两个线程都到达了同步点,这两个线程就可 阅读全文
posted @ 2017-11-18 12:02 木易森林 阅读(491) 评论(0) 推荐(0) 编辑
摘要:Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所(变态除外),其他人想蹲坑,只能排队等待,如果有人从厕所出来,后面的一个人就可以进去。在这个例子中人就 阅读全文
posted @ 2017-11-18 11:44 木易森林 阅读(1860) 评论(0) 推荐(0) 编辑
摘要:CyclicBarrier的字面意思是可以循环使用的Barrier,它要做的事情是让一个线程到达一个Barrier的时候被阻塞,直到最后一个线程到达Barrier,屏障才会放开,所有被Barrier拦截的线程才会继续运行。 CyclicBarrier的默认的构造器是CyclicBarrier(int 阅读全文
posted @ 2017-11-18 11:07 木易森林 阅读(433) 评论(0) 推荐(0) 编辑
摘要:CountDownLatch允许一个或则多个线程等待其他线程完成操作。 假如我们有这样的需求:我们需要解析一个excel文件中的多个sheet,我们可以考虑使用多线程,每一个线程解析excel中的一个sheet表格,等所有的线程都完成解析之后,程序提示解析完成,输出解析结果。要实现这个需求,最简单的 阅读全文
posted @ 2017-11-18 10:14 木易森林 阅读(286) 评论(0) 推荐(0) 编辑