
源码
文章平均质量分 81
CodersCoder
有人见星辰,有人见尘埃。
展开
-
Java可重入锁(GPT编写)
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。Java可重入锁的实现基于AQS框架,它通过状态变量state和等待队列来实现锁的获取和释放。Java可重入锁支持可重入性,即同一个线程可以多次获取同一个锁,而不会造成死锁或其他并发问题。原创 2023-10-18 15:55:46 · 856 阅读 · 0 评论 -
源码分析--ThreadLocal(二)
常用方法(1).set方法: public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }set方法的代码非常短,首先原创 2020-11-06 20:40:07 · 143 阅读 · 0 评论 -
源码分析--ThreadLocal(一)
概述以下内容来源于源码注释ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线程都可以通过其 get 或 set方法来访问自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。类图内容提炼:1、Thread 类有维护了一个属性变量 threadLocals (ThreadLocal.ThreadLocalMap thr原创 2020-11-05 19:07:11 · 195 阅读 · 0 评论 -
源码分析--ThreadPoolExecutor(二)
常用方法核心方法:execute// command 是一个 Runnable 对象,也就是用户提交执行的任务public void execute(Runnable command) { // 提交的任务为空时抛出异常 if (command == null) throw new NullPointerException(); /* * Proceed in 3 steps: * * 1. If fewer than coreP原创 2020-11-04 19:22:17 · 114 阅读 · 0 评论 -
源码分析--ThreadPoolExecutor(一)
概述ThreadPoolExecutor 是 JDK 中线程池的实现类,开发过程中,合理地使用线程池可以有很多好处:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。它的继承结构如下:源码分析构造方法:ThreadPoolExecutor 内部有多个构造器Threa原创 2020-11-03 19:30:30 · 115 阅读 · 0 评论 -
源码分析--LockSuppoprt
概述1、LockSupport是Java6引入的一个工具类, 用于挂起和唤醒线程;2、所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。3、通过提供park() 和 unpark() 方法实现阻塞线程和解除线程阻塞, 实现阻塞与解除阻塞是基于许可(permit), permit相当于一个信号量,只能取0和1, 默认为0;源码分析构造方法:只有一个无参构造方法,无需解析。重要属性: private static final sun.misc.Unsafe原创 2020-11-01 19:48:20 · 135 阅读 · 0 评论 -
源码分析--FutureTask(二)
常用方法set & setException:更新状态值,唤醒栈中等待的线程protected void set(V v) { // CAS 将 state 修改为 COMPLETING,该状态是一个中间状态 if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = v; // 输出结果赋值 // 将 state 更新为 NORMAL原创 2020-10-30 19:23:07 · 108 阅读 · 0 评论 -
源码分析--FutureTask(一)
概述FutureTask 是一个可取消的、异步执行任务的类,它实现了 RunnableFuture 接口,而该接口又继承了 Runnable 接口和 Future 接口,因此 FutureTask 也具有这两个接口所定义的特征。RunnableFuture 接口public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the resul原创 2020-10-29 19:39:34 · 160 阅读 · 0 评论 -
源码分析--ReentrantReadWriteLock(二)
读锁读锁的获取:读锁的获取可以通过ReadLock的lock()方法: public void lock() { sync.acquireShared(1); }Sync的acquireShared(int arg)定义在AQS中: public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcqu原创 2020-10-28 18:40:34 · 118 阅读 · 0 评论 -
Spring源码--InitializingBean
使用背景因为需要支持其他项目组改造任务,需要了解该系统相关框架和部分代码,在查看该系统已开发好的模块时,发现对于配置类,使用了不同的bean初始化方式。如下:分别使用了spring中的InitializingBean和@Bean的初始化,由于InitializingBean之前没有使用过,所以来学习一下。附spring中bean实例化过程如下:说明InitializingBean接口只包含一个方法afterPropertiesSet(),凡是继承了InitializingBean接口的类,原创 2020-10-27 19:11:01 · 241 阅读 · 0 评论 -
源码分析--ReentrantLock
常用方法ReentrantLock 常用的方法就是 Lock 接口定义的几个方法,如下:// 获取锁(阻塞式)public void lock() { sync.lock();}// 获取锁(响应中断)public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1);}// 尝试获取锁public boolean tryLock() { retur原创 2020-10-26 19:26:52 · 114 阅读 · 0 评论 -
源码分析--Lock&ReentrantLock
概述涉及多线程问题,往往绕不开「锁」。在 JDK 1.5 之前,Java 通过 synchronized 关键字来实现锁的功能,该方式是语法层面的,由 JVM 实现。JDK 1.5 增加了锁在 API 层面的实现,也就是 java.util.concurrent.locks.Lock 接口及其相关的实现类,它不仅具备 synchronized 的功能,而且还增加了更加丰富的功能。Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻原创 2020-10-25 20:21:32 · 127 阅读 · 0 评论 -
源码分析--ReentrantReadWriteLock(一)
概述ReentrantReadWriteLock 是读写锁,它维护了一对锁:一个读锁,一个写锁。读锁之间是共享的,写锁是互斥的。与 ReentrantLock 相比,读写锁在读多写少的场景下允许更高的并发量。类图如下:ReentrantReadWriteLock中的类分成三个部分:(1)ReentrantReadWriteLock本身实现了ReadWriteLock接口,这个接口只提供了两个方法readLock()和writeLock();(2)同步器,包含一个继承了AQS的Sync内部类,以及原创 2020-10-24 20:59:59 · 140 阅读 · 0 评论 -
源码分析--Semaphore
概述Semaphore 是并发包中的一个工具类,可理解为信号量。通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数。主要方法如下:其中主要方法是 acquire() 和 release() 相关的一系列方法,它们的作用类似。void acquire():从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。void release():释放一个许可,将其返回给信号量。int availablePermits():返回此信号量中当前可用的许可数。原创 2020-10-23 20:14:04 · 119 阅读 · 0 评论 -
源码分析--CyclicBarrier
概述CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要。方法使用样例:public class CyclicBarrierTest { public static void main(String[] args) {原创 2020-10-22 19:55:39 · 137 阅读 · 0 评论 -
源码分析--CountDownLatch
概述CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。简单起见,可以把它理解为一个倒数的计数器:初始值为线程数,每个线程结束时执行减 1 操作,当计数器减到 0 时等待的线程再继续执行。类结构图和方法CountDownLatch没有实现Serializable接口,所以它不是可序列化的。其中两个原创 2020-10-21 18:50:38 · 177 阅读 · 0 评论