![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
DandelionCoder
在技术的海洋中游荡,探到最深处,寻回内心的方向 。
展开
-
jdk 5并发包中CopyOnWrite类的用法
jdk 5的concurrent包中,添加了几个CopyOnWrite开头的类,包括: CopyOnWriteHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet;copy-on-write模式声明了,为了维护对象的一致性快照,要依靠不可变性(immutability)来消除在协调读取不同的但是相关的属性时需要的同步。对于集合,这意味着如果有大量的读转载 2015-07-13 11:15:56 · 418 阅读 · 0 评论 -
深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题
主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是《Java Concurrency in Practice》,结合自己的理解和实际应用对锁机制进行一个小小的总结。 首先需要强调的一点是:所有锁(包括内置锁和高级锁)都是有性能消耗的,也就是说在高并发的情况下,由于锁机制带来的上下文切换、资源同步等消耗是非常可观的。在某些极端情况下,线程在锁上的消耗可能比线程本身的消耗还要多。所以如果可转载 2015-07-20 16:13:43 · 325 阅读 · 0 评论 -
深入浅出 Java Concurrency (20): 并发容器 part 5 ConcurrentLinkedQueue
ConcurrentLinkedQueue是Queue的一个线程安全实现。先来看一段文档说明。一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLin转载 2015-07-20 18:31:55 · 409 阅读 · 0 评论 -
深入浅出 Java Concurrency (16): 并发容器 part 1 ConcurrentMap (1)
从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器。在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchronized*系列也可以看作是线程安全的实现)。从JDK 5开始增加了线程安全的Map接口ConcurrentMap和线程安全的队列BlockingQueue(尽管Queue也是同时期引入的新的集合,转载 2015-07-20 16:30:55 · 440 阅读 · 0 评论 -
深入浅出 Java Concurrency (19): 并发容器 part 4 并发队列与Queue简介
Queue是JDK 5以后引入的新的集合类,它属于Java Collections Framework的成员,在Collection集合中和List/Set是同一级别的接口。通常来讲Queue描述的是一种FIFO的队列,当然不全都是,比如PriorityQueue是按照优先级的顺序(或者说是自然顺序,借助于Comparator接口)。下图描述了Java Collections Framewor转载 2015-07-20 18:09:54 · 379 阅读 · 0 评论 -
深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)
从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock)。ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何“读/读”,“写/读”,“写/写”操作都不能同时发生。但是同样需要强调的一个概念是,锁是有一定的转载 2015-07-20 12:09:53 · 424 阅读 · 0 评论 -
深入浅出 Java Concurrency (17): 并发容器 part 2 ConcurrentMap (2)
本来想比较全面和深入的谈谈ConcurrentHashMap的,发现网上有很多对HashMap和ConcurrentHashMap分析的文章,因此本小节尽可能的分析其中的细节,少一点理论的东西,多谈谈内部设计的原理和思想。要谈ConcurrentHashMap的构造,就不得不谈HashMap的构造,因此先从HashMap开始简单介绍。 HashMap原理我们从头开始设想。要将对象存转载 2015-07-20 17:25:34 · 397 阅读 · 0 评论 -
深入浅出 Java Concurrency (18): 并发容器 part 3 ConcurrentMap (3)
在上一篇中介绍了HashMap的原理,这一节是ConcurrentMap的最后一节,所以会完整的介绍ConcurrentHashMap的实现。 ConcurrentHashMap原理 在读写锁章节部分介绍过一种是用读写锁实现Map的方法。此种方法看起来可以实现Map响应的功能,而且吞吐量也应该不错。但是通过前面对读写锁原理的分析后知道,读写锁的适合场景是读操作>>写操作,也就是读操转载 2015-07-20 17:45:02 · 424 阅读 · 0 评论 -
Java并发编程实践-总结
根据《Java并发编程实践》一书整理的思维导图。希望能够有所帮助。第一部分:第二部分:第三部分:转载 2015-10-15 13:53:31 · 272 阅读 · 0 评论 -
深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)
这一节主要是谈谈读写锁的实现。上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock。如果真的是两个锁的话,它们之间又是如何相互影响的呢?事实上在ReentrantReadWriteLock里锁的实现是靠java.util.concurrent.locks.ReentrantReadWriteLock.Sync完成的。这个类看起来比较眼熟,实际上它是A转载 2015-07-20 16:04:40 · 475 阅读 · 0 评论 -
深入浅出 Java Concurrency (3): 原子操作 part 2
在这一部分开始讨论数组原子操作和一些其他的原子操作。AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择有代表性的AtomicIntegerArray来描述这些问题。int get(int i)获取位置 i 的当前值。很显然,由于这个是数组操作,就有索引越界的问题(IndexOutOfBoundsExcepti转载 2015-07-15 12:07:12 · 330 阅读 · 0 评论 -
ConcurrentHashMap实现原理
锁分离 (Lock Stripping) ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。转载 2015-07-13 14:25:14 · 541 阅读 · 0 评论 -
【java并发】juc高级锁机制探讨
最近在看一些juc相关的设计和源码,接上文:【java并发】基于JUC CAS原理,自己实现简单独占锁本文探讨一下juc里面提供的一些高级锁机制和基本原理。 JUC高级锁机制简介Juc提供了高级锁的一些特性和应用,如:ReentrantLock:和synchronized具有差不多的语义,独占锁,同时只有一个线程能获得锁。ReentrantReadWriteLock:读写锁转载 2015-07-16 09:42:51 · 443 阅读 · 0 评论 -
深入浅出 Java Concurrency (5): 原子操作 part 4
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错转载 2015-07-15 15:22:22 · 270 阅读 · 0 评论 -
深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
在这个小结里面重点讨论原子操作的原理和设计思想。由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念。在Java Concurrency in Practice中是这样定义线程安全的:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就是线程安全的。显转载 2015-07-15 14:53:52 · 325 阅读 · 0 评论 -
深入浅出 Java Concurrency (6): 锁机制 part 1
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合。尽管synchronized在语法上已经足够简单了,在JDK 5之前只能借助此实现,但是由于是独占锁,性能却不高转载 2015-07-15 15:39:24 · 338 阅读 · 0 评论 -
深入浅出 Java Concurrency (7): 锁机制 part 2 AQS
在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer。AQSAbstractQueuedSynchronizer,简称AQS,是J.U.C最复杂的一个类,导致绝大多数讲解并发原理或者实战的时候都不会提到此类。但是虚心的作者愿意借助自己有限的转载 2015-07-15 16:51:48 · 305 阅读 · 0 评论 -
spring aop简单日志实例
一直就用spring的IOC,遗憾spring的另一重要组成部分AOP却没用过,所以近几天抽空研究了下AOP,学了些东西,在这里记录下spring2.0的aop配置,以一个简单的记录日志的实例来说明,先介绍下用XMLSchema来配置,下一篇介绍annotation配置,废话不多说,开始吧先新建个web工程,将spring的包加进去,为方便就把全部的jar包加进去。先来看个接口,很简单转载 2015-07-16 10:43:59 · 390 阅读 · 0 评论 -
深入浅出 Java Concurrency (2): 原子操作 part 1
从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始)。很多情况下我们只是需要一个简单的、高效的、线程安全的递增递减方案。注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易;高效意味着耗用资源要少,程序处理速度要快;线程安全也非常重要,这个在多线程下能保证数转载 2015-07-15 11:44:49 · 307 阅读 · 0 评论 -
简述 ThreadPoolExecutor 处理流程
ThreadPoolExecutor继承自抽象类AbstractExecutorService,该抽象类实现了ExecutorService接口。ThreadPoolExecutor也是我们运用最多的线程池。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,原创 2017-09-12 17:50:59 · 620 阅读 · 0 评论