
Java并发实现原理
文章平均质量分 88
JDK源码解析
SmallKa0
CCPC银牌 ICPC银牌 双非acmer
展开
-
ConcurrentSkipListMap
ConcurrentSkipListMap是基于SkipList实现的有序且线程安全的Map。为什么要使用跳查表实现呢?因为目前计算机领域还没找到一种高效的、作用在树上的、无锁的、增加和删除节点的办法。原创 2024-05-21 23:42:39 · 824 阅读 · 0 评论 -
JDK8 ConcurrentHashMap源码解析
4、把元素放入槽内。在第一次扩容的时候,sizeCtl会被设置为一个很大负数,之后每一个线程扩容的时候sizeCtl+1,每一个线程扩容完成之后,sizeCtl减1。2、加锁的粒度,并非整个ConcurrentHashMap,而是对每个头节点加锁,即并发度就是Node数组的长度,初始长度为16,和在JDK7中的Segment的个数相同。3、在线程扩容未完成之前,有的数组下标已经迁移完毕,有的还在旧的HashMap中,当使用get的时候还是会访问旧的HashMap,怎么处理呢?3、提供扩容的并发度。原创 2024-05-21 23:02:43 · 935 阅读 · 0 评论 -
JDK7 ConcurrentHashMap源码解析
第二个参数是负载因子,传给了Segment的内部,当每个Segment的元素个数达到一定阈值,进行rehash。,对链表尾部一串新hash值相同的一个子链表,不需要一个个移动,只需要将lastRun位置的节点连接到新数组中。扩容后数组变成两倍原数组大小,新的hash值有两种可能,1.原hash值,2.原hash值加上原数组长度。,一次对Segment数组hash,一次对HashEntry数组进行hash。为了提高hash的计算性能,会保证数组的大小始终是2的整数次方。,若没有发现重复的节点,则。原创 2024-05-21 20:37:45 · 466 阅读 · 0 评论 -
并发容器BlockingQueue/Deque、CopyOnwrite、ConcurrentLinkedQueue扫盲
add----当队列满时会抛出异常 remove----当队列空时会抛出异常offer----当队列满时会返回false peek----当列队空时会返回NULLput----当队列满时阻塞 take----当队列空时阻塞。原创 2024-05-21 19:46:20 · 718 阅读 · 0 评论 -
同步工具类-Sempaphone、CountDownLatch、CyclicBarrier、Exchanger
Slot用于交换数据,保存其中一个线程的数据,当第二个线程到时,进行数据交换。一个Slot只能支持2个线程之间交换数据,要实现多个线程并行的交换诗句,需要多个Slot,因此在Exchanger里面定义了Slot数组。每个线程在调用exchange函数交换数据的时候,会先创建一个Node对象,这个Node对象包含了要交换的数据,线程本身,对方所要交换的数据,初始为NULL。假设有n个线程来获取资源n>10,那么n个线程中只有10个能获得资源,其他线程都会阻塞,直到有现成释放了资源。原创 2024-05-21 00:47:47 · 1914 阅读 · 0 评论 -
StampedLock详解
StampedLock的写锁是不可重入锁。使用的数据结构不是AQS,是类似于AQS的队列,在自旋加入队列时也会去抢锁。维护了一个读线程的链表,唤醒一个则唤醒全部。StampedLock不响应中断。当被中断信号唤醒时会不断自旋占用CPU。原创 2024-05-19 23:35:18 · 838 阅读 · 0 评论 -
Conditon源码详解
Condition有两个核心方法await和signal方法,调用时必须获取到Lock锁。Condition里维护等待队列的是一个单向链表。阻塞时在等待队列中插入一个condition节点,然后先释放锁再park阻塞。被唤醒时通过查看是否在AQS同步队列中判断是否是被signal唤醒的。是-重新拿锁。释放时,从等待队列中取头节点,将状态改为初始状态,然后加入到AQS队列中调用unpark唤醒。一、Condition与Lock的关系。原创 2024-05-19 12:26:55 · 339 阅读 · 0 评论 -
读写锁详解
和互斥锁相比,读写锁就是读线程和读线程之间可以不用互斥。其实现为同一把锁的两个试图而已。可以理解为是一把锁,线程分为两类,读线程和写线程互斥,写线程和线程也互斥。共用同一个AQS。state变量拆成两半,一半表示写锁,一半表示读锁。原创 2024-05-19 02:16:09 · 1729 阅读 · 0 评论 -
Lock互斥锁详解
ReentrantLock 是JDK1.5 引入的J.U.C包中的一个比较重要的可重入的、互斥的并且支持公平和非公平的锁,其实现了 Lock接口,其内部是通过 AQS + CAS 原理实现的。其具备 synchronized 关键字加锁的所有功能,并且还具备一些 synchronized 锁不具备的功能,比如:尝试拿锁,支持中断、支持超时等待等。原创 2024-05-19 01:31:19 · 2041 阅读 · 0 评论 -
Atomic类
对原子类知识进行梳理。原子类基于CAS函数实现,采用的乐观锁的实现方式。Unsafe提供了Integer、Long、Object的CAS操作函数。对应的类有AtomicInteger、AtomicLong、AtomicReference对ABA问题的解决:AtomicStapedReference、AtomicMarkableReference。通过引入版本号来实现,要同时进行两个值的CAS所以只能实现引用对象的Atomic类。原创 2024-05-17 23:22:37 · 1200 阅读 · 0 评论 -
多线程基础
1. 单线程中的每个操作 happend-before任意后续操作2. 对volatile变量的写入,happen-before对应后续对这个变量的读取。3. 对synchronized的解锁,happen-before对应后续对这个锁的加锁。4. happen-before的传递性5. final变量的写可见于后续的final变量的读。(3)原理在编译器和CPU层面都有对应的指令,也就是内存屏障。编译器的内存屏障只是为了告诉编译器不要对执行进行重排序。原创 2024-05-17 01:35:00 · 858 阅读 · 0 评论