
|--JUC
文章平均质量分 95
Holmofy
奋斗中的小菜鸟
展开
-
Java多线程复习与巩固(三)--线程同步
多线程容易出现的问题因为一个进程内,多个线程线程共享该进程的资源,而进程之间,资源的获取是互斥的,所以线程间通信比进程间通信更简单。我们可以直接通过共享资源的访问来实现线程间通信,这种通信方式十分有效(速度快),但也容易产生错误,如:线程干扰和内存一致性错误。看一下下面这个例子:这个程序有两个线程,一个线程对计数器进行10000次加一操作,一个线程对计数器进行10000次减一操作,两个线程...原创 2017-06-14 23:56:11 · 1070 阅读 · 3 评论 -
ThreadPoolExecutor最佳实践--如何选择队列
前一篇文章《如何选择线程数》讲了如何决定线程池中线程个数,这篇文章讨论“如何选择工作队列”。再次强调一下,ThreadPoolExecutor最核心的四点:1、当有任务提交的时候,会创建核心线程去执行任务(即使有核心线程空闲);2、当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;3、当BlockingQueue满了(offer失败),就...原创 2018-08-12 20:55:45 · 6116 阅读 · 0 评论 -
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。总结一下,主要有以下四点:当有任务提交的时候,会创建核心线程去执行任务;当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;当BlockingQueue满了(offer失败),就回创建临时线程;当线程总数达到maximumPoo...原创 2018-07-29 15:47:05 · 16160 阅读 · 4 评论 -
A Java Fork/Join Framework
原文链接:A Java Fork/Join Framework(PDF) - Doug Lea 基于并发编程网 – ifeve.com上 Alex/萧欢 翻译、方腾飞 校对的译文稿:Java Fork Join 框架 译文发在并发编程网 – ifeve.com:Java Fork/Join框架, 2017-11-02Java Fork/Join框架...翻译 2018-02-24 14:06:34 · 727 阅读 · 0 评论 -
Java多线程复习与巩固(七)--任务调度线程池ScheduledThreadPoolExecutor
强烈建议看本文之前,先把《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》看完。首先因为ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,不了解ThreadPoolExecutor的原理看本文可能会有些吃力;另外本文的行文思路会按照《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》的顺序进...原创 2018-02-22 00:07:34 · 1562 阅读 · 0 评论 -
Java多线程复习与巩固(九)--volatile关键字与CAS操作
前一篇文章中提到原子操作,也许大家和我一样很好奇为什么AtomicInteger.increment方法能保证原子性,而简单的++运算却不能保证原子性。这篇文章我们就从AtomicInteger类下手分析源码,来了解一下原子操作的实现原理,但是分析源码之前需要来一段小小的前奏。CPU内存架构现代计算机都是多处理机CPU,每个核心(Core)都有一套寄存器,CPU访问寄存器的速度是最快的...原创 2017-06-27 23:16:48 · 5160 阅读 · 0 评论 -
Java多线程复习与巩固(八)--原子性操作与原子变量
前面讲线程同步时,我们对多线程出现的问题进行了分析,在那个例子中,问题的根源在于c++和c--这两个操作在底层处理的时候被分成了若干步执行。当时我们用的是synchronized关键字来解决这个问题,而从synchronize的实现原理中我们知道synchronized通过monitor监视器来实现线程同步,这种同步方式要求线程等待monitor的拥有者线程释放后,才可能进一步执行,而线程等待可能...原创 2017-06-26 18:13:13 · 747 阅读 · 0 评论 -
Java多线程复习与巩固(六)--线程池ThreadPoolExecutor详解
1. 为什么要使用线程池线程创建与销毁都耗费时间,对于大量的短暂任务如果仍使用“创建->执行任务->销毁”的简单模式,将极大地降低线程的使用效率(一个线程仅仅处理一个短暂的任务就被销毁了)。在这种情况下,为了提高线程的使用效率,我们使用缓存池的策略让线程执行任务后不立即销毁而是等待着处理下一个任务。2. 使用Executors工具类创建线程池Executors是线程池框原创 2017-08-19 14:16:38 · 5129 阅读 · 3 评论 -
Java多线程复习与巩固(二)--线程相关工具类Timer和ThreadLocal的使用
定时器(Timer类)如果我们需要让某个任务在另一个线程中周期性的执行,或者让它在某个时刻执行一次。这时我们可能会写这样的代码:周期任务:// 周期任务public class PeriodTask implements Runnable{ private long period = 1000; private boolean running = true; ...原创 2017-06-14 21:21:43 · 904 阅读 · 0 评论 -
Java多线程复习与巩固(一)--线程基本使用
进程与线程在并发编程中,有两个基本的执行单元:进程和线程。在Java中,并发编程主要关心的是线程。当然,进程也很重要。进程(Process)进程有独立的执行环境,一个进程有一套私有的、完整的运行时资源,比如:每个进程都有自己的内存空间。进程通常会被认为是一个应用程序的代名词。但实际上一个应用程序可能会包含多个协同工作的进程。比如你电脑里的360打开后肯定有两个或两个以上的进程:...原创 2017-06-14 15:27:20 · 1009 阅读 · 0 评论 -
互斥锁与自旋锁
互斥锁(Mutex)互斥锁是一种实现线程同步的机制:当一个线程尝试获取互斥锁,如果互斥锁已经被占用则该线程会被挂起进入睡眠状态,直到被唤醒。线程被挂起时,CPU会将该线程当前的处理状态保存到内存中,等到唤醒时从内存中读取上次的处理状态,这个CPU切换线程处理状态的过程被称为“上下文切换”。上下文切换是一个非常耗时的操作,它需要相当多的CPU指令才能完成。但在早期单核处理器中,只能通过这个方式来...原创 2017-06-28 21:12:20 · 1084 阅读 · 0 评论 -
自旋锁公平性的三种实现
随着多核处理器的爆炸式增长,多线程同步访问共享内存的性能也成了计算机系统发展的关键。在《互斥锁与自旋锁》这篇文章中我们提到了互斥锁与自旋锁之间的区别以及各自的优点和适用场景。普通自旋锁的实现我们适用Java代码来实现一个简单的自旋锁:import java.util.concurrent.atomic.AtomicBoolean;public class Spinlock ...原创 2017-07-17 00:14:16 · 3511 阅读 · 0 评论 -
Java多线程复习与巩固(五)--生产者消费者问题(第一部分)
生产者消费者问题(第一部分)生产者消费者问题也称为有限缓冲问题,是线程同步的一个经典问题:生产者线程和消费者线程共享一块固定大小的缓存,生产者负责生成产品然后存入共享缓冲区中,消费者负责从共享缓冲区中取出产品进行消费。该问题的关键在于生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。要解决这个问题就必须:让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产...原创 2017-08-01 19:56:18 · 940 阅读 · 0 评论 -
Java多线程复习与巩固(四)--synchronized的实现
小小的回顾在上一篇文章的例子中有一个Counter类:static class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; }}为了实现线程同...原创 2017-06-15 20:46:36 · 991 阅读 · 0 评论 -
ForkJoinPool入门篇
《线程池ThreadPoolExecutor详解》和《任务调度线程池ScheduledThreadPoolExecutor》两篇文章将ThreadPoolExecutor和ScheduledThreadPoolExecutor两个核心线程池已经详细介绍过了,它们整体的工作结构如下图所示。这篇文章将介绍最后一个线程池——Java7中最引人瞩目的ForkJoinPool线程池。1. 为...原创 2018-09-16 14:57:33 · 12427 阅读 · 2 评论