并发编程
文章平均质量分 88
零点悟
这个作者很懒,什么都没留下…
展开
-
Java锁的理解
1.可重入锁可重入的意思是在一个线程中可以多次获取同一把锁而不会出现死锁,ReentrantLock和synchronized都是可重入锁。public class ReentrantTest { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { sync原创 2021-04-14 14:55:46 · 149 阅读 · 2 评论 -
线程池使用FutureTask时注意事项
线程池使用FutureTask时如果拒绝策略设置为DiscardPolicy和DiscardOldestPolicy,并且调用被拒绝的任务的get()方法,那么调用线程会一直被阻塞。所以当我们在使用Future时最好是使用带超时时间的get方法,这样超时时间到了就会自动返回,也不会使得shutdown失效。当然我们也可以重写DiscardPolicy拒绝策略,在拒绝策略中修改FutureTask的状态值为大于COMPLETING原创 2021-01-06 11:47:40 · 763 阅读 · 1 评论 -
JAVA同时启动多个线程(CyclicBarrier实现及原理分析)
本文讲讲使用CyclicBarrier的实现多个线程同时启动以及CyclicBarrier的复用。CyclicBarrier基于独占锁实现,本质底层还是基于AQS,其内部维护了count和parties两个变量,这也就是为什么CyclicBarrier能复用的原因,一开始的时候count等于parties,每当有线程调用await()方法时,count就减1,当count等于0时所有线程开始执行,同时会将parties的值赋给count,从而进行复用。原创 2020-12-31 17:02:54 · 491 阅读 · 0 评论 -
JAVA同时启动多个线程(CountDownLatch实现及原理分析)
日常开发中经常会遇到需要同时启动多个线程去并行执行任务的情况,但如果使用循环启动多个线程,并不是真正意义上的同时启动,JDK提供了CountDownLatch和CyclicBarrier可以很好的处理这个问题。。本文先讲讲CountDownLatch的实现方式和原理。CountDownLatch是使用AQS实现的,其使用AQS的状态值来存储计数器的值,在初始化的时候设置计数器的值,调用await()方法将当前线程放入AQS的阻塞队列等待计数器的值变为0后返回原创 2020-12-29 14:30:21 · 1302 阅读 · 0 评论 -
JAVA线程池的理解
当我们需要执行异步任务时,可以选择new一个新的线程来运行,但线程的创建和销毁是需要开销的,执行大量异步任务时这样做会对系统性能产生影响。使用线程池可以很好的解决这样的问题,线程池里面的线程是可以复用的,不用每次执行异步任务时都重新创建和销毁线程。线程池还有一个优势就是提供了一种资源限制手段和管理手段,比如可以限制线程的个数。本文主要讲讲对线程池主要参数,线程池流程,线程池配置,Java提供的几种常用线程池等的理解原创 2020-12-24 14:40:46 · 151 阅读 · 0 评论 -
原子变量操作类AtomicLong详解
JUC并发包中有AtomicInteger、AtomicIntegerArray、AtomicLong、AtomicBoolean等原子变量操作类,他们原理都类似,本文主要分析为什么需要原子操作类以及AtomicLong类的实现原理。原创 2020-12-18 17:58:35 · 1124 阅读 · 0 评论 -
ThreadLocal原理分析
ThreadLocal提供了线程本地变量,也就是说如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会为这个变量生成一个本地副本,当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。InheritableThreadLocal继承自 ThreadLocal 其提供了一个特性,就是让子线程可 以访问在父线程中设置的本变量。原创 2020-12-01 22:53:56 · 90 阅读 · 0 评论