
并发编程
原力与你同在
我,最后的绝地武士
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
java多线程常见工具类使用
java多线程场景工具类使用CountDownLatch使用CyclicBarrier使用Exchanger使用Semaphore信号量Condition交替打印123,共10次线程main、线程0、线程1按照顺序依次执行线程池内部线程执行任务报错处理execute提交的任务(无返回值)submit提交的任务报错 CountDownLatch使用 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorS原创 2022-05-05 14:12:27 · 2289 阅读 · 0 评论 -
CountDownLatch源码分析
countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次。 查看CountDownLatch的构造函数 // 传入一个大于0的资源信息 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } 内部持有一个静态内部类,作原创 2021-05-14 16:14:58 · 152 阅读 · 0 评论 -
ReentrantLock源码分析
上一篇文章重点分析了AQS的源码,有了这个认识,我们再看ReentrantLock的源码,会简单很多,来看下这个类 // 创建一个锁 ReentrantLock lock = new ReentrantLock(); // 默认是非公平锁,提升效率 public ReentrantLock() { sync = new NonfairSync(); } // 属性 private final Sync sync; 看下Sync这个ReentrantLo原创 2021-05-14 15:42:24 · 84 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁源码学习
ReentrantReadWriteLock锁的属性如下 // 这里持有了读锁 private final ReentrantReadWriteLock.ReadLock readerLock; // 这里持有了写锁 private final ReentrantReadWriteLock.WriteLock writerLock; // 内部同步类 final Sync sync; ReentrantReadWriteLock的构造函数如下 public R原创 2021-05-14 21:11:48 · 98 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList是线程安全的并发容器,适合读多写少的场景,是一种读写分离的并发策略,读操作是无锁的。来看下这张图: 优点:适用于读多写少的场景,读效率很高; 缺点:有写操作时,需要复制一份,占用内存,而且时效性不强(写时读的依然时老数据) 看看这个类的属性: // 锁 final transient ReentrantLock lock = new ReentrantLock(); // volatile修饰,保证可见性 private transien原创 2021-05-25 10:42:02 · 109 阅读 · 0 评论 -
ReadWriteLock的实现原理
ReadWriteLock成为读写锁,事java并发包下的一个类,该锁包括读锁和写锁。其中读锁之间采用共享式获取锁资源,读线程之间互不影响;如果有线程获取了读锁,那么写锁则会获取失败;如果有线程获取了写锁,则读锁获取失败(非同一线程),写锁是可重入锁,也是独占锁。读写锁的共享资源是4个字节的int类型,高16位表示读锁数;低16位表示写锁次数。 00000000 00000000 00000000 00000000 c:=0 读写锁都没有 w:=0 读锁没有 r:=写锁没有 00000000 0000000原创 2021-05-27 10:44:14 · 672 阅读 · 0 评论 -
两个线程交替打印0-9之间数字,使用Condition
两个线程交替打印0-9之间数组,使用Condition import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ConditionDemo { static priv原创 2021-12-01 16:17:05 · 484 阅读 · 0 评论 -
AQS源码学习
AQS(全称AbstractQueuedSynchronizer抽象队列同步器)作为juc包下重要的基础类,是实现其他并发工具的基础类,来学习下AQS源码 先看看类继承结构,AQS继承了AbstractOwnableSynchronizer这个类 AbstractOwnableSynchronizer类的结构如下 public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { priv原创 2021-05-14 11:02:24 · 333 阅读 · 0 评论 -
unsafe类使用demo
public class UnsafeUseDemo { long sizeCtl; long transferIndex; public static void main(String[] args) { UnsafeUseDemo unsafeUseDemo = new UnsafeUseDemo(); System.out.println(unsafeUseDemo.transferIndex); unsafeUseDemo.ca原创 2021-11-29 18:44:17 · 154 阅读 · 1 评论 -
java中断的理解
java中断的理解Object.wait方法Thread.sleep方法thread.join方法t.interrupt(); t.isInterrupted();Thread.interrupted()对比 thread.join、thread.sleep和Object.wait都会响应中断,看看代码 Object.wait方法 //也是jvm控制响应中断 public final native void wait(long timeout) throws InterruptedException; T原创 2021-11-29 11:58:41 · 222 阅读 · 0 评论 -
java线程池理解
使用java线程池好处: 可以避免虚拟机来回创建线程导致的资源消耗问题; 可以提高服务响应效率; 便于对线程进行统一管理。 线程池原理 线程池里面持有ctl字段,32位长度,高3位代表线程池状态;低29位代表运行 的线程的个数。 对于新提交的一个任务,线程池首先判断当前线程数是否超过了核心线程数, 如果没有超过,则创建新的线程执行提交的任务;如果当前线程超过了核心 线程数,则讲任务放入任务队列里面,等待其他线程从队列获取执行;如果 当前队列已满,且当前线程数小于最大线程数,则创建worker。 worker原创 2021-05-20 15:51:45 · 98 阅读 · 0 评论 -
ThreadPoolExecutor线程池原理
发现两篇写的不错的文章,转载之 文章一 文章二原创 2020-09-05 10:40:30 · 129 阅读 · 0 评论 -
ReentrantLock&&AQS源码分析(部分)
ReentrantLock 公平锁加锁代码 protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); //为0,尝试获取锁。如果当前线程的等待线程队列没有前驱&&cas设置锁成功,那么设置当前线程为锁持有者 if (c =原创 2020-06-14 09:54:05 · 189 阅读 · 1 评论