
源码
文章平均质量分 81
CodersCoder
有人见星辰,有人见尘埃。
展开
-
Java可重入锁(GPT编写)
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。Java可重入锁的实现基于AQS框架,它通过状态变量state和等待队列来实现锁的获取和释放。Java可重入锁支持可重入性,即同一个线程可以多次获取同一个锁,而不会造成死锁或其他并发问题。原创 2023-10-18 15:55:46 · 844 阅读 · 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 · 131 阅读 · 0 评论 -
源码分析--ThreadLocal(一)
概述 以下内容来源于源码注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线程都可以通过其 get 或 set方法来访问自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 类图 内容提炼: 1、Thread 类有维护了一个属性变量 threadLocals (ThreadLocal.ThreadLocalMap thr原创 2020-11-05 19:07:11 · 183 阅读 · 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 · 107 阅读 · 0 评论 -
源码分析--ThreadPoolExecutor(一)
概述 ThreadPoolExecutor 是 JDK 中线程池的实现类,开发过程中,合理地使用线程池可以有很多好处: 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。 它的继承结构如下: 源码分析 构造方法: ThreadPoolExecutor 内部有多个构造器 Threa原创 2020-11-03 19:30:30 · 109 阅读 · 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 · 127 阅读 · 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 · 105 阅读 · 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 · 152 阅读 · 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 · 110 阅读 · 0 评论 -
Spring源码--InitializingBean
使用背景 因为需要支持其他项目组改造任务,需要了解该系统相关框架和部分代码,在查看该系统已开发好的模块时,发现对于配置类,使用了不同的bean初始化方式。 如下: 分别使用了spring中的InitializingBean和@Bean的初始化,由于InitializingBean之前没有使用过,所以来学习一下。 附spring中bean实例化过程如下: 说明 InitializingBean接口只包含一个方法afterPropertiesSet(),凡是继承了InitializingBean接口的类,原创 2020-10-27 19:11:01 · 235 阅读 · 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 · 110 阅读 · 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 · 122 阅读 · 0 评论 -
源码分析--ReentrantReadWriteLock(一)
概述 ReentrantReadWriteLock 是读写锁,它维护了一对锁:一个读锁,一个写锁。读锁之间是共享的,写锁是互斥的。与 ReentrantLock 相比,读写锁在读多写少的场景下允许更高的并发量。 类图如下: ReentrantReadWriteLock中的类分成三个部分: (1)ReentrantReadWriteLock本身实现了ReadWriteLock接口,这个接口只提供了两个方法readLock()和writeLock(); (2)同步器,包含一个继承了AQS的Sync内部类,以及原创 2020-10-24 20:59:59 · 137 阅读 · 0 评论 -
源码分析--Semaphore
概述 Semaphore 是并发包中的一个工具类,可理解为信号量。通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数。 主要方法如下: 其中主要方法是 acquire() 和 release() 相关的一系列方法,它们的作用类似。 void acquire():从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 void release():释放一个许可,将其返回给信号量。 int availablePermits():返回此信号量中当前可用的许可数。原创 2020-10-23 20:14:04 · 110 阅读 · 0 评论 -
源码分析--CyclicBarrier
概述 CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要。 方法 使用样例: public class CyclicBarrierTest { public static void main(String[] args) {原创 2020-10-22 19:55:39 · 129 阅读 · 0 评论 -
源码分析--CountDownLatch
概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行。 CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。 简单起见,可以把它理解为一个倒数的计数器:初始值为线程数,每个线程结束时执行减 1 操作,当计数器减到 0 时等待的线程再继续执行。 类结构图和方法 CountDownLatch没有实现Serializable接口,所以它不是可序列化的。 其中两个原创 2020-10-21 18:50:38 · 169 阅读 · 0 评论