Java并发源码分析-线程池源码分析
参考文献
AbstractExecutorService源码解析
submit方法
123456789101112131415161718192021222324252627282930public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); // 通过submit方法提交的Callable任务会被封装成了一个FutureTask对象。 // 通过Executor.execute方法提交FutureTask到线程池中等待被执行,最终执行的是FutureTask的run方法; RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } /** * @throws RejectedExecutionException { ...
JDK动态代理源码分析
参考文献
JDK版本
123java 11.0.20 2023-07-18 LTSJava(TM) SE Runtime Environment 18.9 (build 11.0.20+9-LTS-256)Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.20+9-LTS-256, mixed mode)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136/** * Returns a ...
Java并发源码分析-ConcurrentHashMap源码分析
参考文献
面试 ConcurrentHashMap ,看这一篇就够了!
ConcurrentHashMap
JDK1.7
在 JDK1.7 中,ConcurrentHashMap 使用了分段锁的机制,将哈希表分为多个 Segment,每个 Segment 上都有一把锁,不同的 Segment 可以被不同的线程同时访问,这样可以提高并发度,减少锁的争用。
每个 Segment 内部使用一个 HashEntry 数组来存储元素,每个 HashEntry 都是一个链表的头节点,通过链表的方式解决哈希冲突。这种数据结构的设计使得并发情况下,只有访问同一个 Segment 上的元素才需要加锁,其他 Segment 上的元素可以并发访问,提高了并发度。
JDK1.8之后
在 JDK1.8 中,ConcurrentHashMap 放弃了 Segment 分段锁的机制,采用了与HashMap相同的Node 数组+链表+红黑树的结构。这样可以减少了锁的竞争,提高了并发度,同时也减少了内存占用。
在 JDK1.8 中,ConcurrentHashMap 使用了CAS +synchroniz ...
Java并发源码分析-AbstractQueuedSynchronizer源码分析
参考文献
万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)
<<Java并发编程艺术>>
AbstractQueuedSynchronizer
队列同步器,简称同步器或AQS
AQS可重写的方法
方法名称
方法描述
protected boolean tryAcquire(int arg)
独占式获取同步状态
protected boolean tryRelease(int arg)
独占式释放同步状态
protected int tryAcquireShared(int arg)
共享式获取同步状态返回值>=0表示获取成功,反之获取失败
protected boolean tryReleaseShared(int arg)
共享式释放同步状态
protected boolean isHeldExclusively()
当前同步器是否在独占模式下被线程使用,一般该方法表示是否被当前线程独占.
同步状态指的是有volatile修饰的state变量,涉及的相关方法
方法名称
方法描述 ...