
Java并发学习
6点A君
记录我学习的知识的地方~
展开
-
Java并发学习(一)-synchronized及锁的学习
Index这些天开始学习Java并发相关知识,依靠买的些书籍以及网上大佬文章,去解读Java在设计并发方面的思想以及领略魅力。synchronized介绍估计有一部分同学接触到并发与同步的时候,基本就是了解一些操作系统方面的并行与并发,例如生产者消费者,银行家算法以及死锁。而去接触从代码角度去防止死锁与并发,就是在接触synchronized关键字的时候开始的,我自己也是一样。 对于synchro原创 2017-11-12 14:48:03 · 729 阅读 · 0 评论 -
Java并发学习(十四)-StampedLock深入浅出
Java8在concurrent.lock下新加了一个类:StampedLock,这个类和其他锁的类,都不相同。下面一起来学习下这个类。What is StampedLock记得在学习AtomicStampedReference 时,里面是用一个标志stamp,来解决ABA问题。即通过版本号,来检验是否保持一个相对静止的状态,从而能够保证更加线程安全的读写。具体可看:Java并发学习(十)-CAS中原创 2017-12-06 13:24:24 · 1064 阅读 · 0 评论 -
Java并发学习(十九)-Java8中ConcurrentHashMap分析
断断续续看了那么些天,趁着周末把知识记下来。在平常编程时,HashMap是用的很频繁的一个类,但是,当在并发情况下,却不推荐使用它,因为它没有做任何的并发控制,不安全,是个隐患。当然,在Java中,也有适用与并发情况下对应HashMap的HashTable,以及Collections包装的synchronizedMap 方法。二者原理基本一直,都是在HashMap基础上,给方法加上synchroni原创 2017-12-19 08:56:14 · 876 阅读 · 1 评论 -
Java并发学习(十八)-并发工具Exchanger
断断续续看了一个多礼拜,Exchanger总算是看明白了,思想不难,但是不理解思想去看代码就比较难了。 下面慢慢学习。What is Exchanger关于Exchanger,你可以把他看做一个中介,或者信使,它可以让两个运行的线程相互交换东西(Object),并且是带阻塞性质的。 打个比方,两个线程A,B两个要交换东西oa和ob,它们都在运行,使用exchanger这个中介,因为线程调度,并不原创 2017-12-15 17:36:46 · 538 阅读 · 0 评论 -
Java并发学习(二十)-ConcurrentLinkedQueue分析
ConcurrentLinkedQueue原创 2017-12-25 00:00:45 · 508 阅读 · 0 评论 -
Java并发学习(二十四)-PriorityBlockingQueue分析
这几天利用空闲时间学习了一个新的阻塞队列-PriorityBlockingQueue,具有优先级的队列,也就是里面的节点是按照一定的顺序而排列的,当你执行take等方法时候,总是会弹出最大(最小)的节点。那么它是一种什么原理的呢?What is PriorityBlockingQueue这里首先讲讲PriorityBlockingQueue所用道的数据结构。 试想,如果自己要设计一个优先级队列,会原创 2018-01-13 15:11:35 · 551 阅读 · 0 评论 -
Java并发学习(二十六)-Java中SynchronousQueue分析
上个礼拜断断续续看了挺久的SynchronousQueue,第一眼理解的意思和现在看懂了之后的意思感觉还是有那么大的差别的。所以不懂的东西慢慢看总会看懂的~~下面进入正题What is SynchronousQueue首先什么是SynchronousQueue呢?它也是一种阻塞队列,实现了BlockingQueue 的接口。 我一开始看的时候,以为它和Exchanger 一样,也是可以两个线程之间原创 2018-01-22 16:49:58 · 618 阅读 · 0 评论 -
Java并发学习(二十五)-DelayQueue分析
在使用Redis时候,存放的元素有过期一说,当过期后,就不能被取出来了。当然实现思路上比较容易理解,设定一个过期时间即可。当然在Java语言中,也有这样的类似的过期功能,它就是DelayQueue。主要有以下几方面用途:关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。任务超时处理。在网络协议滑动窗口请求应答式交互时,原创 2018-01-14 18:09:35 · 580 阅读 · 0 评论 -
Java并发学习(二十一)-ConcurrentSkipListMap分析
在并发包下面,还有一种数据结构,这就是跳表(SkipList),第一次听说跳表是在redis里面,但当时只是大概理解意思。这次学习并发包,遇到了ConcurrentSkipListMap,那就一次从跳表特性,put和get操作,以及Doug Lea通过怎样一种结构,保证了它的线程安全性。What is ConcurrentSkipListMap首先说说什么是跳表,常见数据结构有线性表和树以及图,当然原创 2018-01-06 01:09:20 · 607 阅读 · 0 评论 -
Java并发学习(二十七)-LinkedTransferQueue分析
前后花了一个多礼拜来学习LinkedTransferQueue,整理了一些新的和了解,就此记下来。What is LinkedTransferQueue先来看看LinkedTransferQueue是什么? 它是Java7才出现的一个新的阻塞队列,继承了AbstractQueue 抽象类,实现了Java7出现的TransferQueue的接口。 其他的阻塞队列,用生产者消费者来模拟的话,生产者生原创 2018-01-30 20:09:33 · 1319 阅读 · 0 评论 -
Java并发学习(二十二)-ArrayBlockingQueue分析
这两天花了几个小时来看ArrayBlockingQueue,阻塞队列。其实它的实现思想是比较简单的,主要是利用ReentrantLock和Condition来实现。首先理解什么是阻塞队列: 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空。 当队列满时,存储元素的线程会等待队列可用。 阻塞队原创 2018-01-07 10:06:29 · 798 阅读 · 0 评论 -
Java并发学习(二十三)-LinkedBlockingQueue和LinkedBlockingDeque分析
有两个比较相似的并发阻塞队列,LinkedBlockingQueue和LinkedBlockingDeque,两个都是队列,只不过前者只能一端出一端入,后者则可以两端同时出入,并且都是结构改变线程安全的队列。其实两个队列从实现思想上比较容易理解,有以下特点:链表结构(动态数组)通过ReentrantLock实现锁利用Condition实现队列的阻塞等待,唤醒以下将分开讲述LinkedBloc原创 2018-01-10 20:23:18 · 12755 阅读 · 2 评论 -
Java并发学习(二十八)-Callable及FutureTask分析
过了个春节,感觉还是家里面舒服啊~~ 最开始接触Java多线程时候,主要就是Thread和Runnable,即继承Thread或者实现Runnable接口,再通过start方法即可开一个线程。但是run方法是没有返回值的,就类似于泼出去的水,你是无法知道其内部执行状态的。当然可以通过一些特定的volatile变量来标识。 Java5之后,出现了一个新的接口Callable,它的功能就是Runab原创 2018-02-24 22:33:25 · 572 阅读 · 0 评论 -
Java并发学习(五)-LockSupport里面的park和unpark
学习AQS源码时候,发现当判断队列需要入队挂起时,都是调用LockSupport里面的park和unpark方法,例如://park并且检查是否中断private final boolean parkAndCheckInterrupt() { LockSupport.park(this); return Thread.interrupted(); }原创 2017-11-26 19:20:10 · 9480 阅读 · 0 评论 -
Java并发学习(十三)-ReentrantReadWriteLock学习
ReentrantReadWriteLock原创 2017-12-04 14:20:24 · 615 阅读 · 0 评论 -
Java并发学习(二)-JMM
JMM,全称是Java Memory Modle,即Java内存模型。 这些天在学习JMM,这里就记下来和大家一起学习。JMM?下面看看为什么会有JMM?cpu高速缓存带来不一致问题其实我感觉对于初学者而言,基本都不会接触到JMM,我自己当初也一样,别人问我JMM我都不知道是什么。那么为什么会出现JMM呢? 众所周知,现在电脑基本都是多任务多处理器的了,并且指令都是放入主存里面,而执行则是在cp原创 2017-11-17 13:17:15 · 885 阅读 · 1 评论 -
Java并发学习(四)-sun.misc.Unsafe
UnsafeUnsafe类是什么呢?java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。或许在读源码时候会发现,LockSupport里面会调用到unsafe.park,undafe.unpark,而同样在AQS里面会调用到unsafe里面众多CAS相关代码。 这些天在看源码时候,总会遇到park,unpark,CAS相关指令,都是从Unsafe里面调原创 2017-11-26 00:26:36 · 4174 阅读 · 0 评论 -
Java并发学习(七)-AtomicInteger基本数据类型类
从Java5开始,出现了concurrent并发包,这里主要先介绍atomic包下面的AtomicXXX诸如AtomicBoolean,AtomicInteger,AtomicLong等原子更新类,它们内部实现思想基本一致,这里以AtomicInteger为例进行介绍。 AtomicXXX主要包括:AtomicInteger,AtomicBoolean,AtomicLong,AtomicRefer原创 2017-11-28 13:55:58 · 1325 阅读 · 0 评论 -
Java并发学习(八)-AtomicIntegerArray数组类型类
前一篇文章学习了AtomicXXX基本数据类型类,可以为int,boolean或者reference类型,也就是单个元素的原子类。那么数组类型呢? 下面以AtomicIntegerArray为例进行分析。 AtomicXXXArray包括三种具体类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。What is AtomicInte原创 2017-11-28 19:16:02 · 1626 阅读 · 0 评论 -
Java并发学习(九)-AtomicIntegerFieldUpdater字段原子更新类
前面讲的两个AtomicInteger和AtomicIntegerArray,这两个都是在最初设计编码时候就已经考虑到了需要保证原子性。但是往往有很多情况就是,由于需求的更改,原子性需要在后面加入,类似于我不要求你这整个类操作具有原子性,我只要求你里面一个字段操作具有原子性。没错,concurrent.atomic包下AtomicIntegerFieldUpdater就是这个作用的。AtomicXX原创 2017-11-29 11:24:28 · 4819 阅读 · 0 评论 -
Java并发学习(十)-CAS中ABA问题解决方法
前面讲了很多次的CAS,但是CAS可能会出现一个问题,前面也说过,这篇文章具体讲讲,就是ABA的问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。What is ABA有个经典的链表的例子可以来说明这种隐藏的问原创 2017-11-29 19:41:01 · 1047 阅读 · 1 评论 -
Java并发学习(六)-深入分析CAS操作
What is CAS在Java并发包下源码中,经常会遇到CAS操作,即Compare And Swap操作,例如: //AQS里面替换head private final boolean compareAndSetHead(Node update) { return unsafe.compareAndSwapObject(this, headOffset, null,原创 2017-11-27 23:54:22 · 823 阅读 · 2 评论 -
Java并发学习(十一)-LongAdder和LongAccumulator探究
Java8在atomic包新增了5个类,分别是Striped64,LongAdder,LongAccumulator,DoubleAdder,DoubleAccumulator。其中,Sriped64作为父类,其他分别是long和double的具体实现。 下面首先从父类Striped64这个类开始讲,其几个类都是遵从它的结构进行实现的。What is Striped64Striped64,就向一个原创 2017-11-30 22:39:13 · 1630 阅读 · 0 评论 -
Java并发学习(十五)-并发工具Semaphore
What is Semaphore一个并发工具Semaphore,位于java.util.concurrent 下面,在并发家族里面充当着工具类的角色。 那么Semaphore作为一个工具,有什么作用呢? 控制容量,就好比一个停车场,容量为100,已经听了50,所以此时还能再停50,如果已经停了100的话,那么外面的车就进不去了,只能在外面等。此时当有车出来时,才能有车进去。具体实现首先看Sem原创 2017-12-09 16:39:27 · 455 阅读 · 0 评论 -
Java并发学习(十六)-并发工具CyclicBarrier
What is CyclicBarrier从名字来看,barrier:栅栏,cyclic:循环的。 简单点说,它能够让一组数量线程在某一个时间点等待,当所有线程都到了,再让它们运行。 例如有这样一个情景,有n个excel表格数据,你需要获取他们所有的数据后,再进行下一步运算。利用CyclicBarrier来做,首先需要开n个线程,等这n个线程都完成到达这个点,再进行下一步运算。 首先看它的内部原创 2017-12-09 23:29:58 · 412 阅读 · 0 评论 -
Java并发学习(十二)-ReentrantLock分析
What is ReentrantLockReentrantLock,从单词字面上理解,就是可重入锁,他内部实现了两种锁的机制,公平锁与非公平锁,排他性的, 继承自AbatractQueuedSynchronizer,依靠着AQS里面的FIFO队列进行线程的调度。可以参看:Java并发学习(三)-AbstractQueuedSynchronizerLock介绍ReentrantLock继承Lock接原创 2017-12-01 14:07:41 · 506 阅读 · 1 评论 -
Java并发学习(十七)-并发工具CountDownLatch
另一个并发工具,CountDownLatch,和CyclicBarrier功能上有点类似,但是在实现上和是不同的。What is CountDownLatch简单的说,也是一个计数器,和CyclicBarrier相比,一定方面是更加灵活的,CountDownLatch可以在任意代码处通知自己已完成,等所有都做完时,主线程就可以接下来运行了。有需要可参看:Java并发学习(十六)-并发工具Cyclic原创 2017-12-10 18:52:57 · 429 阅读 · 0 评论 -
Java并发学习(三)-AbstractQueuedSynchronizer
AQS简介与ReentrantLock的关系AQS队列结构AQS结构分析AQS里面的stateAQS中锁的获取与释放排他锁普通获取排他锁的过程acquire可中断获取排他锁doAcquireInterruptibly超时获取排它锁doAcquireNanos释放排它锁release共享锁共享锁的普通获取acquireShareddoAcquireSharedInterrup原创 2017-11-23 10:47:36 · 848 阅读 · 1 评论 -
Java并发学习(二十九)-ThreadPoolExecutor及相关类学习与分析
线程池还是很重要的,框架中或者其他应用上,都用的比较多,以前写过一片低配线程池:简单的线程池技术写法及要点 看完线程池后,才发现远比当时想得多得多。首先来看ThreadPoolExecutor的一个简单例子:public class ThreadPoolTest { public static void main(String[] args) { Execu原创 2018-03-03 01:41:12 · 476 阅读 · 0 评论