并发包和框架
文章平均质量分 55
Java并发包、并发框架
胡小禾
左手写码,右手写诗。一个混迹在二线厂,爱代码但不想当程序员的打工人
展开
-
ConcurrentHashMap 原子操作的写法欣赏
文章目录在阅读 slf4j 源码的时候,发现BasicMarkerFactory的一个方法实现很有典型意义: 恰好说明了在使用减少锁争用/CAS的一个技巧.public class BasicMarkerFactory implements IMarkerFactory { private final ConcurrentMap<String, Marker> markerMap = new ConcurrentHashMap<String, Marker>();原创 2022-02-03 17:53:32 · 906 阅读 · 1 评论 -
多线程设计范式-WorkerThread模式
文章目录1.What2.How1.WhatWorkerThread可以理解为流水线模式, 上游的工人完成一个电子器件的组装之后(线程干完上一个任务), 将器件放在传送带(向缓冲中写入元素), 传送带的装配工接着装配, 再传递给下一个装配工.线程池有点像流水线模式. A.submit(Runnable B)之后, A不再管线程池是怎么调度\怎么执行B了.那跟生产者-消费者模式有啥区别呢?看下图:生产者-消费者模式:Producer-Consumer是完全解耦的, Queue不需要感知到Co原创 2021-10-16 21:20:12 · 573 阅读 · 0 评论 -
Guava 集合工具(不可变集合)
不可变集合一、不可变对象对象的不可变形式是安全的: 1)在多线程条件下不存在竞态问题 2)不可变集合不需要考虑变化,节省空间和时间。不可变集合比可变形式有更好的内存利用率 3)不可变集合常做常量容器创建对象的不可变拷贝是一种有效的防御性编程技巧,可以避免原来假想为不可变的对象被误改。以ImmutableList 为例:List&lt;String&gt; list =...原创 2018-05-16 20:20:57 · 1016 阅读 · 0 评论 -
Guava Files 简单API使用
关键工具类import com.google.common.io.Files; 类似的,在Java8中也有一个Files工具类: java.nio.file.Files 注意两者的区别。1、将字节内容写入到文件File,可以指定编码 com.google.common.io.Files#write(byte[], java.io.File)final File newFile ...原创 2018-05-16 14:26:15 · 5045 阅读 · 0 评论 -
CopyOnWriteArrayList 写时复制
文章目录1、从String类的不可变性实现说起2、COW的应用领域3、CopyOnWriteArrayList 与 CopyOnWriteArraySet的场景4、一个案例5、部分关键源码思考下:为啥没CopyOnWriteLinkedList?1、从String类的不可变性实现说起Immuability模式:对象创建之后,状态就不再变化String是不可变类,本质上是个字符数组pu...原创 2019-07-10 18:12:46 · 276 阅读 · 0 评论 -
CAS
文章目录1、volatile不能保证原子性2、synchronized是大开销操作3、CAS(原子类)解决方案4、原子类的核心源码分析5、CAS的问题6、更深入:CAS的原理7、CAS在并发包的地位8、CAS思想在业务代码中的应用参考文献本文介绍了CAS算法的应用场景及原理。1、volatile不能保证原子性假设有个场景,在单实例环境下,记录访问某接口的用户数。为此,设计了一个计数器,代码如...原创 2019-05-11 10:44:10 · 147 阅读 · 0 评论 -
Java中的原子操作
文章目录1、什么是原子操作2、Java中原子操作的实现方式2.1 用CAS实现原子操作2.1.2 使用CAS实现原子操作2.1.3 CAS实现原子操作的问题3、Java中使用锁实现原子操作4、CPU如何实现原子操作1、什么是原子操作原子操作:一个或多个操作在CPU执行过程中不被中断的特性当我们说原子操作时,需要分清楚针对的是CPU指令级别还是高级语言级别。比如:经典的银行转账场景,是语言级...原创 2019-05-11 10:42:36 · 18973 阅读 · 6 评论 -
synchronized内存语义
文章目录1、锁释放、获取与happens-before关系2、锁释放、获取的内存语义3、锁内存语义的实现4、concurrent包的实现锁(synchronized)除了让临界区互斥执行,其内存语义也要重视。1、锁释放、获取与happens-before关系锁除了互斥执行代码,还能让释放锁的线程向另一个拿锁的线程发消息。public class SynchronizedExample {...原创 2019-05-11 10:37:36 · 1032 阅读 · 1 评论 -
七、ExecutorService的API
七、ExecutorService的API7.1 API overview首先来概览一下,这个接口大概有哪些重要API:invokeAny() 与 invokeAll() 具有阻塞特性invokeAny() 取得第一个完成任务的结果值,当第一个任务执行完成后,调用interrupt() 中断其他任务,所以可以结合if(Thread.intterruptted())决定任务是否继续运...原创 2018-11-15 23:00:02 · 991 阅读 · 0 评论 -
六、CompletionService
六、CompletionService6.1 JDK中的解释先看JDK文档对这个接口的解释:public interface CompletionService&lt;V&gt;A service that decouples the production of new asynchronous tasks from the consumption of the results of ...原创 2018-11-15 22:58:54 · 904 阅读 · 1 评论 -
五、Future&Callable
五、Future&amp;Callable5.1 Introduction :Runnable &amp; Callable 区别:1)Runnable没有返回值,Future &amp; Callable 使线程具有返回值的功能。2)Callable接口的call() 方法可以声明抛出异常,Runnable接口的run() 方法不可以抛出异常,只能try catch执行完callabl...原创 2018-11-15 22:57:12 · 530 阅读 · 0 评论 -
Java并发工具类和框架常识(todo)
六、ExecutionServiceinvokeAny() 取得第一个完成任务的结果值,当第一个任务执行完成后,调用interrupt()中断其他任务,所以可以结合if(Thread.intterruptted())决定任务是否继续运行。invokeAll() 等全部线程任务执行完成后,取得全部完成任务的结果值。invokeAny、invokeAll 都具有阻塞特性1、Object in...原创 2018-10-27 15:14:31 · 652 阅读 · 0 评论