并发编程
文章平均质量分 62
_Kim
1261895547@qq.com
展开
-
并发编程艺术笔记:并发队列、七大阻塞队列
目录ConcurrentLinkedQueue阻塞队列1、ArrayBlockingQueue2、LinkedBlockingQueue3、PriorityBlockingQueue4、DelayQueue5、SynchronousQueue6、LinkedTransferQueue7、LinkedBlockingDequeConcurrentLinkedQ...原创 2019-07-28 13:38:54 · 365 阅读 · 0 评论 -
并发编程艺术笔记:Fork/Join、线程池、Executor
目录Fork/Join框架运行流程工作窃取算法核心组件ThreadPoolExecutor处理过程线程池创建线程池状态工作线程线程工厂线程池调度过程核心方法execute方法工作线程的执行工作线程的清理任务的获取线程池拒绝策略线程池关闭合理配置线程池线程池监控Executor框架Excutors下的几种线程池...原创 2019-07-31 21:16:04 · 463 阅读 · 0 评论 -
并发编程艺术笔记:Java并发机制、Java内存模型
目录Java并发机制上下文切换VolatileSynchronized原子操作的实现Java内存模型1、Java内存模型的基础2、重排序3、顺序一致性内存模型4、volatile的内存语义5、锁的内存语义6、final域的内存语义7、happens-before8、类的初始化过程Java并发机制上下文切换CPU通过时间片分配算法来...原创 2019-07-22 12:07:39 · 194 阅读 · 0 评论 -
并发编程艺术笔记:Java中的锁(重入锁、读写锁、LockSupport、Condition接口)
目录3、重入锁实现分析:构造函数实现重进入公平与非公平获取锁的区别非公平锁为什么造成线程“饥饿”为什么非公平锁性能好4、读写锁实现分析:1.读写状态的设计2.构造函数3.写锁的获取与释放4.读锁的获取与释放5.锁降级5、LockSupport6、Condition接口实现分析:1.等待队列2.等待3.通知3、重入锁...原创 2019-07-26 10:34:03 · 217 阅读 · 0 评论 -
并发编程艺术笔记:Java中的锁(Lock、AQS)
目录线程状态变化1、Lock接口2、队列同步器1.同步队列核心结构2.独占式同步状态获取与释放3.共享式同步状态获取与释放4.独占式获取响应中断5.独占式超时获取同步状态线程状态变化1、Lock接口Lock接口提供的synchronized关键字不具备的主要特性Lock接口的API2、队列同步器1.同步队列AQS提供几个可...原创 2019-07-24 22:43:32 · 183 阅读 · 0 评论 -
Java核心技术19 | 并发库中的线程池
通常都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService类型或者不同的初始参数。Executors目前提供了5种不同的线程池创建配置:newCachedThreadPool(),它是用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置时间超...原创 2019-04-04 19:41:15 · 190 阅读 · 0 评论 -
Java核心技术13 | ReentrantLock和Synchronized的区别
线程安全概念:保证多线程环境下共享的,可修改的状态的正确性。即如果状态不是共享的,或是不可修改的,也就不存在线程安全问题。保证线程安全的两个方法:封装:通过封装,将对象内部状态隐藏起来,保护起来。 不可变:final和immutable对象。线程安全需要保证几个基本特性:原子性:相关操作不会中途被其他线程干扰,一般通过同步机制实现。 可见性:一个线程修改了某个共享变量,其状...原创 2019-03-28 14:51:12 · 134 阅读 · 0 评论 -
并发核心技术总结(一)
(1)线程安全和锁Synchronized概念一、Java实现多线程方式(1)继承Thread并重写run()方法,用start()方法启动线程(2)实现Runnable接口二、synchronized(1)可以在任意对象及方法上加锁,加锁的代码成为“互斥区”或“临界区”(2)同步的目的是为了线程的安全,需要满足两个最基本的特性:原子性和可见性(2)可重入锁以及Sync...转载 2019-04-02 20:22:23 · 247 阅读 · 0 评论 -
并发核心技术总结(二)
(7)ThreadLocal造成OOM内存溢出案例演示与原理分析下图中描述了:一个Thread中只有一个ThreadLocalMap,1个ThreadLocalMap中可以有多个ThreadLocal对象,其中一个ThreadLocal对象对应一个ThreadLocalMap中的一个Entry,也就是说一个Thread可以依附有多个ThreadLocal对象。下图中实线代表强引用,虚线...转载 2019-04-02 20:23:25 · 124 阅读 · 0 评论 -
并发核心技术总结(三)
(10)关于锁优化的几点建议 减少锁持有的时间 减小锁粒度 HashMap是线程不安全的 HashTable无论是进行读还是写操作都需要获取锁,因此有了ConcurrentHashMap的出现 如ConcurrentHashMap有16个Segment,也就是有16把锁,这样的话不同的线程获取不同锁锁住某一个Segment,就可以实现高并发的操作,这也是减小锁粒度的一个...转载 2019-04-02 20:24:08 · 153 阅读 · 0 评论 -
并发核心技术总结(四)
start()和run()方法源码start()方法其实是通过start0()方法启动线程的public synchronized void start() { // 如果线程不是"就绪状态",则抛出异常! if (threadStatus != 0) throw new IllegalThreadStateException(); // 将线程...转载 2019-04-02 20:28:57 · 170 阅读 · 0 评论 -
总线锁定和缓存一致性的问题
转自https://blog.csdn.net/qq_21125183/article/details/80848941随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。我们知道,CPU和物理内存之间的通信速度远慢于CP...转载 2019-07-17 16:09:34 · 710 阅读 · 0 评论 -
Java核心技术10 | ConcurrentHashMap
JDK1.7及早期版本分离锁,将内部进行分段(Segment),里面则是HashEntry的数组,和HashMap类似,哈希相同的条目也是以链表的形式存放。 HashEntry内部使用volatile的value字段来保证可见性,也利用了不可变对象的机制以改进利用Unsafe提供的底层能力,比如volatile access,去直接完成部分操作,以最优化性能,毕竟Unsafe中的很多操作都是...原创 2019-03-23 15:06:14 · 216 阅读 · 0 评论 -
Java核心技术18 | 并发包中的常用队列
有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,只有以“Concurrent”为前缀的容器才是真正的并发容器。Concurrent类型基于lock-free,在常见的多线程访问场景,一般可以提供较高吞吐量。 而LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。java.util.concurrent包提供的容器从命名上可...原创 2019-04-03 23:57:19 · 252 阅读 · 0 评论 -
集合包简介
1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack。(01) LinkedList是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。(02) ArrayList是数组实现的队列,它是一个动态数组;它也不是线程安全的,只适用于单线程。(03) Vector是数组实现的矢量队列,它也一个动态数组;不过和ArrayList不同的是,...原创 2018-12-02 21:44:59 · 466 阅读 · 0 评论 -
CopyOnWriteArrayList
在添加数据的时候是加锁的public boolean add(E e) { final ReentrantLock lock = this.lock; //加锁 lock.lock(); try { Object[] elements = getArray(); int len = elements.length; ...原创 2018-12-02 21:45:35 · 88 阅读 · 0 评论 -
ConcurrentSkipListSet
(01) ConcurrentSkipListSet继承于AbstractSet。因此,它本质上是一个集合。(02) ConcurrentSkipListSet实现了NavigableSet接口。因此,ConcurrentSkipListSet是一个有序的集合。(03) ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。它包含一个C...原创 2018-12-02 21:47:09 · 459 阅读 · 0 评论 -
ConcurrentHashMap
锁分段,volatile,key或value不允许为null简介Hashtable是线程安全的哈希表,它是通过synchronized来保证线程安全的;即,多线程通过同一个“对象的同步锁”来实现并发控制。Hashtable在线程竞争激烈时,效率比较低(此时建议使用ConcurrentHashMap)!因为当一个线程访问Hashtable的同步方法时,其它线程就访问Hashtable的同步方法...原创 2018-12-02 21:48:57 · 104 阅读 · 0 评论 -
ArrayBlockingQueue
是数组实现的线程安全的有界阻塞队列。内部通过互斥锁保护竞争资源,实现了多线程对竞争资源的互斥访问。有界,是指ArrayBlockingQueue对应的数组是有界限的。是按FIFO先进先出原则对元素进行排序,元素都是从尾部插入到队列,从头部开始返回。1.ArrayBlockingQueue继承于AbstractQueue,并且它实现了BlockingQueue接口。ArrayBl...原创 2018-12-02 21:49:19 · 136 阅读 · 0 评论 -
LinkedBlockingQueue
无界一个链表两把锁两个条件单向链表实现的阻塞队列FIFO排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素吞吐量高于基于数组的队列可选容量(防止过度膨胀),但如果不指定,则默认容量大小为Integer.MAX_VALUELinkedBlockingQueue继承于AbstractQueue,它本质上是一个FIFO(先进先出)的队列。Linked...原创 2018-12-02 21:49:36 · 286 阅读 · 0 评论 -
LinkedBlockingDeque
双向链表支持FIFO FILO,可以从队列的头和尾同时插入或删除操作可选容量(防止过度膨胀),默认容量等于Integer.MAX_VALUELinkedBlockingDeque继承于AbstractQueue,它本质上是一个支持FIFO和FILO的双向的队列。LinkedBlockingDeque实现了BlockingDeque接口,它支持多线程并发。当多线程竞争同一个资源时...原创 2018-12-02 21:49:58 · 119 阅读 · 0 评论 -
ConcurrentSkipListMap
(01) ConcurrentSkipListMap继承于AbstractMap类,也就意味着它是一个哈希表。(02) Index是ConcurrentSkipListMap的内部类,它与“跳表中的索引相对应”。HeadIndex继承于Index,ConcurrentSkipListMap中含有一个HeadIndex的对象head,head是“跳表的表头”。(03) Index是...原创 2018-12-03 12:34:54 · 643 阅读 · 0 评论 -
ConcurrentLinkedQueue
ConcurrentLinkedQueue继承于AbstractQueue。ConcurrentLinkedQueue内部是通过链表来实现的。它同时包含链表的头节点head和尾节点tail。ConcurrentLinkedQueue按照 FIFO(先进先出)原则对元素进行排序。元素都是从尾部插入到链表,从头部开始返回。ConcurrentLinkedQueue的链表No...原创 2018-12-03 12:39:38 · 247 阅读 · 0 评论 -
CopyOnWriteArraySet
1. 简介线程安全的无序的集合,可以将它理解成线程安全的HashSet它最适合于具有以下特征的应用程序:Set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。它是线程安全的。因为通常需要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销很大。迭代器支持hasNext(), next()等不可变操作,但...原创 2018-12-03 12:47:30 · 5525 阅读 · 0 评论 -
单例模式与多线程总结(完整版)
单例模式的使用场景有频繁实例化然后销毁的情况,也就是频繁的new对象创建对象时耗时过多或耗资源过多,但又经常用到的对象频繁访问IO资源的对象,比如数据库连接池或访问本地文件1.饿汉模式public class Singleton{ private static Singleton instance = new Singleton(); private Singleto...原创 2018-12-03 18:48:21 · 148 阅读 · 0 评论 -
Java核心技术14 | synchronized底层实现
synchronized代码块是由一对monitorenter/monitorexit指令实现的,Monitor对象是同步的基本实现单元。在Java 6 之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一...原创 2019-03-29 14:32:55 · 227 阅读 · 0 评论 -
线程的基础学习总结(适合初学)
一、为什么需要多线程? 我们一直都在说使用多线程或者并发编程,但我们应该想想为什么需要用它? 百度百科给的解释是:多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。 通俗易懂的讲,如果不考虑多线程的话,那么在程序只有一条执行路径,代码里串...原创 2018-12-04 16:35:32 · 173 阅读 · 0 评论