【Java并发】
zthgreat
这个人很懒,什么都没有留下
展开
-
Java 并发 ---原子操作的实现原理
并发这块反复研究挺久了,源码也研究了一部分,总觉得缺乏一点认识,想了许久还是总结出来,这样也有助于自己理解原子操作意思为不可被中断的一个或一系列操作。原创 2017-07-25 18:15:09 · 3470 阅读 · 0 评论 -
Java 并发 --- Semaphore源码分析
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,可以用于做流量控制,特别是公共资源有限的应用场景,如果熟悉操作系统的概念,那么肯定对这么名词不陌生,当初在学习Linux进程通信中,也简单的学习过,今天再次接触到Semaphore。原创 2017-12-03 16:21:18 · 393 阅读 · 0 评论 -
Java 并发 --- Exchanger源码分析
Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据。原创 2017-12-07 20:42:55 · 2946 阅读 · 3 评论 -
Java集合之ConcurrentHashMap源码分析
注:本文源码是JDK8的版本ConcurrentHashMap 介绍(jdk 1.8)ConcurrentHashMap是HashMap的升级版,HashMap是非线程安全的集合,ConcurrentHashMap则可以支持并发操作, HashMap是我们平时开发过程中用的比较多的集合,ConcurrentHashMap就算用得少,但是听过的肯定不少,一起来研究研究吧原创 2017-12-16 18:37:19 · 1999 阅读 · 1 评论 -
Java 并发 --- 阻塞队列之LinkedBlockingQueue源码分析
HashMap应该是使用的一个频率很高的一个集合了,平时用得很多,但是了解并不深入,一起来看看HashMap的结构实现和功能原理。 HashMap(jdk 1.8)HashMap是Java的Map家族中一个普通成员,它根据键的hashCode值存储数据,具有很快的访问速度,但遍历顺序却是不确定的,也就是说插入顺序和遍历顺序没有什么关系的,究其原因在于元素的存储结构,后面我们将会学习到,H原创 2017-10-17 22:16:16 · 1392 阅读 · 0 评论 -
Java 并发 --- 阻塞队列之DelayQueue源码分析
DelayQueue 是一个支持延时获取元素的无界阻塞队列,队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延时期满时才能从队列中提取元素。原创 2017-10-29 15:16:22 · 4173 阅读 · 4 评论 -
Java 并发 --- CopyOnWriteArrayList 源码分析
CopyOnWriteArrayList,顾名思义,Write的时候总是要Copy,读写分离的思想,通俗地讲,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器复制出一个新的容器,然后在新的容器里添加元素,添加玩元素之后再讲原来容器的引用指向新的容器。原创 2018-01-04 12:49:30 · 344 阅读 · 0 评论 -
Java 并发 --- 阻塞队列之LinkedTransferQueue源码分析
在前面我们分析了SynchronousQueue,SynchronousQueue这个阻塞队列很特殊,也很抽象,经过一番较量后,终于还是把它拿下,今天我们来看另一个也很抽象的阻塞队列,和SynchronousQueue有很大的相似之处,个人感觉类似扩展的SynchronousQueue。因此在阅读本文之前,最好对SynchronousQueue有比较好的认识原创 2017-11-16 19:30:46 · 962 阅读 · 0 评论 -
Java 并发 --- 阻塞队列总结
前面我们把阻塞队列学习完了,现在过段时间来进行总结一下,也算是复习回顾知识,比较才能明白使用的场景。原创 2017-12-27 20:15:49 · 1228 阅读 · 0 评论 -
Java 线程池 --- ThreadPoolExecutor源码分析
在多线程编程中,或多或少都听过或者使用过线程池,合理利用线程池能够带来三个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必原创 2018-01-23 21:13:57 · 838 阅读 · 0 评论 -
Java 并发 --- ConcurrentSkipListMap源码分析
在学习ConcurrentSkipListMap 之前 我们需要先来学习一种随机化的数据结构–跳跃表(skip list) 对于数组的查找可以有很多方法,如果是有序的,那么可以采用二分查找,二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存。这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了。 对于链表而言,不能进行随机访问,也就是说不能单纯的原创 2018-01-16 19:14:39 · 585 阅读 · 0 评论 -
Java 并发 --- Thread 源码浅析
在多线程编程中,如果要使用线程来执行任务,那么最简单的方式就是使用Thread类来创建一个线程,当然也可以使用线程池的方式。 线程是在进程中执行的单位,线程的资源开销相对于进程的开销是相对较少的,所以我们一般创建线程执行,而不是进程执行。 本文不是学习Thread的使用,而是通过Thread类来一探线程从创建到结束的过程。继承体系 Thread类实现了Runnable接口,因此Thr原创 2018-01-08 14:10:33 · 595 阅读 · 0 评论 -
Java 多线程 --- FutureTask 源码分析
在多线程编程中,创建线程可以直接继承Thread,也可以实现Runnable接口。但是这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,FutureTask,通过它们可以在任务执行完毕之后得到任务执行结果,原创 2018-01-18 20:07:07 · 489 阅读 · 0 评论 -
Java 并发 --- CyclicBarrier源码分析
CyclicBarrier 介绍(jdk 1.8)CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier),它的功能是让一组线程到达一个屏障(也就叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。原创 2017-12-02 15:21:01 · 331 阅读 · 0 评论 -
Java 并发 --- 非阻塞队列之ConcurrentLinkedQueue源码分析
在并发编程中,有时候需要使用线程安全的队列,如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法,在前面我们逐一分析过阻塞队列,这篇文章过后,会写篇关于阻塞队列的总结,也算是回顾知识,非阻塞的实现方式则可以使用循环cas的方式来实现,对于循环cas的算法,都已经遇到多了,在阻塞队列中,也有使用循环cas的队列,比如:SynchronousQueue原创 2017-12-19 19:48:53 · 625 阅读 · 2 评论 -
Java 并发---解读volatile synchronized
volatile在多处理器开发中保证了共享变量的可见性,可见性的意思就是说当一个线程修改一个共享变量时,另一个线程能读到这个修改的值 volatile它不会引起线程上下文的切换和调度。原创 2017-07-26 15:24:13 · 807 阅读 · 0 评论 -
Java 并发 ---AbstractQueuedSynchronizer(同步器)-独占模式
前面我们了解到可以通过synchronized关键字实现锁功能,使用该关键字不需要我们显式的获取和释放锁,操作很方便简单,但是如果我们需要对锁进行操作或者干预,那么这个是没有办法的。 在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,并发包中新增了Lock(和相关实现类)用来实现锁功能原创 2017-08-19 23:45:01 · 4259 阅读 · 1 评论 -
Java 并发 ---AbstractQueuedSynchronizer-共享模式与Condition
上文我们分析了AbstractQueuedSynchronizer独占模式的acquire实现流程,接下来继续看一下AbstractQueuedSynchronizer共享模式acquire的实现流程。可以对比独占模式acquire和共享模式acquire的区别,加深对于AbstractQueuedSynchronizer的理解。共享式同步状态的获取同样在开始前,先大概看一下怎么使用?原创 2017-08-31 00:09:09 · 1613 阅读 · 1 评论 -
Java 并发 ---中断机制
Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。对中断本身最好的理解应该是:它并不会真正中断一个正在运行的线程;它仅仅是发出中断请求,线程自己会在下一个方便的时刻中断自己原创 2017-09-06 22:49:41 · 1062 阅读 · 0 评论 -
Java 并发 ---ThreadLocal源码分析
Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。原创 2017-09-11 22:33:12 · 750 阅读 · 0 评论 -
Java 并发 ---ReentrantLock源码分析
在前面我们分析了AbstractQueuedSynchronizer(同步器),通过内部使用同步器可以实现线程之间的同步,今天我们就来看看基于同步器的锁ReentrantLock是如何实现的。原创 2017-10-05 18:15:25 · 706 阅读 · 0 评论 -
Java 并发 ---ReentrantReadWriteLock源码分析
在我们分析了AbstractQueuedSynchronizer(同步器)之后,分析了ReentrantLock,ReentrantLock内部组合了同步器来完成同步操作,从源码中我们知道ReentrantLock是排它锁(独占锁),这些锁在同一时刻只允许一个线程进行访问,今天我们来分析基于同步器实现的另一个同步组件ReentrantReadWriteLock(读写锁)。本文需要有同步器知识的基础。原创 2017-10-08 20:38:24 · 926 阅读 · 1 评论 -
Java 并发 --- 阻塞队列之ArrayBlockingQueue源码分析
队列是一种FIFO(先进先出)数据结构,在前面我们知道分析过LinkedList的源码,LinkedList可以作为一般的队列使用,既然有阻塞队列,那么肯定就和一般的队列是有不一样的地方,并且使用场景也可能不一样,一起来探究一下阻塞队列的源码。在看本文之前,要有 AbstractQueuedSynchronizer,ReentrantLock,Condition的知识。原创 2017-10-14 21:39:45 · 1025 阅读 · 0 评论 -
Java 并发 --- 阻塞队列之PriorityBlockingQueuey源码分析
在学习完ArrayBlockingQueue,LinkedBlockingQueue 之后,应该对阻塞队列有了一个比较清晰的认识,今天我们来学习另一个阻塞队列PriorityBlockingQueue。PriorityBlockingQueue 介绍PriorityBlockingQueue 是一个支持优先级的无界阻塞队列,默认情况下元素采取自然顺序升序排列原创 2017-10-27 22:17:17 · 1254 阅读 · 2 评论 -
Java 并发 --- 阻塞队列之SynchronousQueue源码分析
与前面分析的几个阻塞队列不一样(ArrayBlockingQueue,PriorityBlockingQueuey),SynchronousQueue 很抽象,前面我们看到的阻塞队列都是真真实实的队列,而且从队列的数据结构上,我们都不难进行分析,只要知道了其存储的数据结构,然后再从方法上很容易进行分析,同时使用了可重入锁来控制数据的安全,锁使得线程安全实现起来如此的简单,而SynchronousQueu使用非锁结构。原创 2017-11-06 18:01:35 · 1767 阅读 · 6 评论 -
Java 并发 --- 阻塞队列之LinkedBlockingDeque源码分析
LinkedBlockingDeque是基于双向链表的双端有界阻塞队列,默认使用非公平ReentrantLock实现线程安全,默认队列最大长度都为Integer.MAX_VALUE;不允许null元素添加;双端队列可以用来实现 "窃取算法" ,两头都可以操作队列,相对于单端队列可以减少一半的竞争。原创 2017-11-20 14:21:38 · 1625 阅读 · 0 评论 -
Java 并发 --- CountDownLatch源码分析
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 实现某个线程等待其余线程完成任务的最简单做法是使用join()方法(join 用于当前执行线程等待被join 线程执行结束),其实现原理就是不停的检查被join 线程是否存活,如果被join 线程存活,则继续让当前线程等待。原创 2017-11-27 21:30:26 · 385 阅读 · 0 评论 -
Guava EventBus 源码分析
前言EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的。设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦。EventBus不是通用型的发布-订阅实现,不适用于...原创 2019-06-08 13:40:24 · 579 阅读 · 1 评论