并发编程
文章平均质量分 85
深入学习并发编程工具类原理
it_xiaohua
这个作者很懒,什么都没留下…
展开
-
JUC 队列
在创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素。延迟队列的特点是:不是先进先出,而是会按照延迟时间的长短来排序,下一个即将执行的任务会排到队列的最前面。ArrayBlockingQueue是最典型的有界阻塞队列,其内部是用数组存储元素的,初始化时需要指定容量大小,利用ReentrantLock 实现线程安全。是无界队列,放入的元素必须实现 Delayed 接口,而 Delayed 接口又继承了 Comparable 接口,所以自然就拥有了比较和排序的能力。原创 2024-06-26 22:32:45 · 859 阅读 · 0 评论 -
ThreadLocal 详讲
每个线程都有一个ThreadLocalMap 类型的 threadLocals 属性。ThreadLocalMap 类相当于一个Map,key 是 ThreadLocal 本身,value 就是我们的值。当我们通过 threadLocal.set(new Integer(123));原创 2024-06-16 11:34:53 · 619 阅读 · 0 评论 -
Condition 详解
调用await和signal方法都需要先获得锁,否则会抛异常。调用await方法会新建一个waitStatus为CONDITION、线程为当前线程的节点到条件队列尾部,然后当前线程会释放掉锁,并进入阻塞状态,直到该节点被移到同步队列或者被中断。该节点被移动到同步队列,并不代表该节点线程能立马获得锁,还是需要在同步队列中排队并在必要时候(前驱节点为head)调用tryAcquire方法去获取,如果获取成功则代表获得了锁。调用signal方法会将条件队列的头节点移动到同步队列。原创 2024-06-09 11:17:04 · 750 阅读 · 1 评论 -
AbstractQueuedSynchronizer (独占模式)
AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地构造出来。不仅ReentrantLock和Semaphore是基于AQS构建的,还包括CountDownLatch、ReentrantReadWriteLock、SynchronousQueue和FutureTask。AQS解决了在实现同步器时涉及的大量细节问题,例如等待线程采用FIFO队列操作顺序。原创 2024-06-06 23:10:57 · 480 阅读 · 0 评论 -
ScheduledThreadPoolExecutor源码解析
我们知道addWorker() 方法会启动线程,所有接下来我们应该查看run()方法。原创 2024-05-30 23:33:21 · 173 阅读 · 0 评论 -
线程池(ThreadPoolExecutor)详解
这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。线程池的本质是对任务和线程的管理,而做到这一点最关键的思想就是将任务和线程两者解耦,不让两者直接关联,才可以做后续的分配工作。addWork方法主要通过 for循环校验当前线程状态,使用CAS 增加当前线程数,提交的 firstTask 创建worker,线程启动时,会调用Worker里的run方法,执行runWorker(this)方法下面会介绍这个方法。原创 2024-05-29 16:11:56 · 1699 阅读 · 0 评论 -
浅聊 Java volatile 关键字
java 并发编程问题三大源头:可见性,有序性,原子性。原创 2024-05-24 23:24:00 · 883 阅读 · 0 评论 -
聊聊synchroized
HotSpot 的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是有一个线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步代码块并且获取锁时,会在对象头和栈帧中的锁记录存储锁偏向的线程ID。轻量级锁加锁,当多线程存在轻微竞争,偏向锁CAS 偏向失败,线程在执行同步代码块之前,JVM 会在当前线程的栈帧中创建用于存储记录的空间,并将对象头的Mark Word 复制到记录中,官方称为Displaced Mark Word。原创 2024-05-22 22:51:28 · 839 阅读 · 0 评论