![](https://img-blog.csdnimg.cn/20210831222400797.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
[TL4]-深入并发编程专题
文章平均质量分 92
[TL4]-深入并发编程专题
萧 炎
这个作者很懒,什么都没留下…
展开
-
并发编程之ForkJoin & Future框架原理分析
一、任务性质类型CPU密集型(CPU-bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于C原创 2021-06-20 09:31:34 · 252 阅读 · 0 评论 -
并发编程之Executor线程池原理与源码解读
一、线程线程是调度CPU资源的最小单位,线程模型分为KLT(内核态)模型与ULT(用户态)模型,JVM使用的KLT模型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有一个对应的线程。Java线程生命状态NEW,新建RUNNABLE,运行BLOCKED,阻塞WAITING,等待TIMED_WAITING,超时等待TERMINATED,终结状态切换如下图所示:二、协程协程 (纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速原创 2021-06-08 21:02:02 · 242 阅读 · 4 评论 -
Java集合框架之CopyOnWrite
背景我们知道,多个线程操作ArrayList的时候,会抛出异常:ArrayList中有一个failfast机制。比如一开始确定集合长度,同时会决定遍历的次数。但是如果某个线程读取的时候,有其他线程又插入元素,就破坏了一开始读到的快照,然后判断之前读到的快照和现在数组不同,就会直接抛出异常。所以Java中增加了线程安全的List:copyOnWriteArrayList.copyOnWriteArrayList可以保证多个线程同时读写是线程安全的。我们自己实现的话,可能会考虑加reentrantLo原创 2021-06-08 09:24:45 · 202 阅读 · 1 评论 -
Java集合框架ConcurrentHashMap详解
一、数据结构ConcurrentHashMap的数据结构与HashMap基本类似,区别在于:1、内部在数据写入时加了同步机制(分段锁)保证线程安全,读操作是无锁操作;2、扩容时老数据的转移是并发执行的,这样扩容的效率更高。二、并发安全控制Java7 ConcurrentHashMap基于ReentrantLock实现分段锁.sements数组中套了一个元素数据,设计的目的是为了分段加锁。分段锁的效率要比整个hashMap加锁高。直接给hashMap加锁,锁的粒度太粗了,性能较低。Semgen原创 2021-06-07 08:05:31 · 766 阅读 · 3 评论 -
Java集合框架之HashMap1.7、1.8详解
数据结构数组+链表+(红黑树jdk>=8)源码原理分析重要成员变量DEFAULT_INITIAL_CAPACITY = 1 << 4; Hash表默认初始容量MAXIMUM_CAPACITY = 1 << 30; 最大Hash表容量DEFAULT_LOAD_FACTOR = 0.75f;默认加载因子TREEIFY_THRESHOLD = 8;链表转红黑树阈值UNTREEIFY_THRESHOLD = 6;红黑树转链表阈值MIN_TREEIFY_CAPACIT原创 2021-06-05 09:37:52 · 1341 阅读 · 2 评论 -
并发编程之CountDownLatch&Semaphore&CyclicBarrier&Executors
一、SemaphoreSemaphore 定义Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。Semaphore常用方法构造方法public Semaphore(int permits)public Semaphore(int permits, boolean fair)permits 表示许可线程的数量fair 表示公平性,如果这个设为 true 的话,下次执行的线程会是等待最久的线程原创 2021-06-02 08:04:48 · 162 阅读 · 0 评论 -
抽象队列同步器AQS应用之BlockingQueue
概要BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作,并且BlockingQueue提供了超时return null的机制,在许多生产场景里都可以看到这个工具的身影。一、队列类型无限队列 (unbounded queue ) - 几乎可以无限增长有限队列 ( bounded queue ) - 定义了最大容量二、队列数据结构队列实质就是一种存储数据的结原创 2021-05-30 22:15:17 · 250 阅读 · 1 评论 -
彻底搞懂AQS-重点方法精讲 [并发劝退- 哭唧唧]
1、acquire(int arg)java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire当我们调用reentrantLock方法后,就会调用acquire.final void lock() { acquire(1);}那我们重点看看这个acquire方法。/** * Acquires in exclusive mode, ignoring interrupts. Implemented原创 2021-05-30 13:03:52 · 641 阅读 · 2 评论 -
抽象队列同步器AQS应用Lock详解
Java并发编程核心在于java.concurrent.util包,而juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQS,AQS定义了一套多线程访问共享资源的同步器框架,是一个依赖 状态(state)的同步器。一、ReentrantLockReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchroni.原创 2021-05-29 15:35:43 · 230 阅读 · 1 评论 -
JVM内置锁Synchronized关键字详解
一、设计同步器的意义多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改引出的问题:由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问!如何解决线程并发安全问题?实际上,所有的并发模式在解决线程安全问题时,采用的方案都是序列化访问临界资源。即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。 Java 中,提原创 2021-05-28 23:52:02 · 459 阅读 · 0 评论 -
CPU缓存一致性协议MESI
一、CPU高速缓存(Cache Memory)CPU为何要有高速缓存CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。时间局部性(Temporal Locality原创 2021-05-28 07:36:31 · 399 阅读 · 0 评论 -
操作系统与虚拟机底层详解
一、冯诺依曼计算机模型详解现代计算机模型是基于-冯诺依曼计算机模型计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作模型。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼计算机模原创 2021-05-24 20:16:06 · 1495 阅读 · 0 评论