![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
原力与你同在
我,最后的绝地武士
展开
-
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 · 2008 阅读 · 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 · 104 阅读 · 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 · 52 阅读 · 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 · 65 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList是线程安全的并发容器,适合读多写少的场景,是一种读写分离的并发策略,读操作是无锁的。来看下这张图:优点:适用于读多写少的场景,读效率很高;缺点:有写操作时,需要复制一份,占用内存,而且时效性不强(写时读的依然时老数据)看看这个类的属性: // 锁 final transient ReentrantLock lock = new ReentrantLock(); // volatile修饰,保证可见性 private transien原创 2021-05-25 10:42:02 · 78 阅读 · 0 评论 -
ReadWriteLock的实现原理
ReadWriteLock成为读写锁,事java并发包下的一个类,该锁包括读锁和写锁。其中读锁之间采用共享式获取锁资源,读线程之间互不影响;如果有线程获取了读锁,那么写锁则会获取失败;如果有线程获取了写锁,则读锁获取失败(非同一线程),写锁是可重入锁,也是独占锁。读写锁的共享资源是4个字节的int类型,高16位表示读锁数;低16位表示写锁次数。00000000 00000000 00000000 00000000c:=0 读写锁都没有 w:=0 读锁没有 r:=写锁没有00000000 0000000原创 2021-05-27 10:44:14 · 579 阅读 · 0 评论 -
两个线程交替打印0-9之间数字,使用Condition
两个线程交替打印0-9之间数组,使用Conditionimport 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 · 414 阅读 · 0 评论 -
AQS源码学习
AQS(全称AbstractQueuedSynchronizer抽象队列同步器)作为juc包下重要的基础类,是实现其他并发工具的基础类,来学习下AQS源码先看看类继承结构,AQS继承了AbstractOwnableSynchronizer这个类AbstractOwnableSynchronizer类的结构如下public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { priv原创 2021-05-14 11:02:24 · 139 阅读 · 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 · 121 阅读 · 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 · 188 阅读 · 0 评论 -
java线程池理解
使用java线程池好处:可以避免虚拟机来回创建线程导致的资源消耗问题;可以提高服务响应效率;便于对线程进行统一管理。线程池原理线程池里面持有ctl字段,32位长度,高3位代表线程池状态;低29位代表运行的线程的个数。对于新提交的一个任务,线程池首先判断当前线程数是否超过了核心线程数,如果没有超过,则创建新的线程执行提交的任务;如果当前线程超过了核心线程数,则讲任务放入任务队列里面,等待其他线程从队列获取执行;如果当前队列已满,且当前线程数小于最大线程数,则创建worker。worker原创 2021-05-20 15:51:45 · 68 阅读 · 0 评论 -
ThreadPoolExecutor线程池原理
发现两篇写的不错的文章,转载之文章一文章二原创 2020-09-05 10:40:30 · 84 阅读 · 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 · 136 阅读 · 1 评论