Java并发基础
文章平均质量分 75
Jonas9
Java程序猿
展开
-
【并发】ThreadPoolExecutor
简介ThreadPoolExecutor是Executor接口的实现类,Executors类的newFixedThreadPool等方法创建的正是ThreadPoolExecutor实例。线程池流程如果线程池当前线程数小于corePoolSize,则会创建新线程处理请求,即使当前有空闲线程;如果当前线程数大于等于corePoolSize,小于maximunPoolSize,将当前请求放入阻塞队列,如果队列已满才会新建线程处理请求;如果线程数已经大于maximunPoolSize,则根据配置的拒绝原创 2021-07-19 23:37:25 · 297 阅读 · 0 评论 -
【并发】Semaphore
使用概述Semaphore是用来控制同时访问共享资源的线程数量,有流量控制的作用。Semaphore维护一批许可,线程通过调用acquire方法来获取许可,获取不到则会发生阻塞,获取到的线程执行完自身逻辑后需要调用release方法进行释放。经典使用场景如下:线程从资源池中获取资源时需要先获取许可,释放资源时也需要释放许可,以便后续的线程可以获得许可。构造函数的第2个参数指定是否采用公平策略,公平策略侧重于保证每个线程不会发生饥饿,而非公平策略侧重于提升吞吐量。获取资源类的需求一般倾向于使用公平策略。原创 2021-01-31 11:56:17 · 115 阅读 · 0 评论 -
【并发】CyclicBarrier
使用概述CyclicBarrier的作用是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier的构造函数是CyclicBarrier(int parties),参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier自己已经到达屏障,然后当前线程被阻塞,直到所有线程到达屏障。与CountDownLatch的区别:CountDownLatch的计数器只能使用一次,而CyclicBarrier的计原创 2021-01-30 18:29:20 · 77 阅读 · 0 评论 -
【并发】CountDownLatch
使用概述CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个整型参数作为计数器,如果需要等待N个线程完成,则传入N。当调用CountDownLatch的countdown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成0。通过CountDownLatch的await方法和countdown方法的配合,我们可以让某个线程在其他N个线程执行完毕后再执行自身任务,类似于join的功能。以下是简单的代码示原创 2021-01-30 16:05:49 · 161 阅读 · 0 评论 -
【并发】原子操作类
一. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了以下3个类:AtomicBooleanAtomicIntegerAtomicLong这三个类的用法和原理类似,这里以AtomicInteger为例详细分析下其内部原理。AtomicInteger核心属性private static final Unsafe unsafe = Unsafe.getUnsafe();//valueOffset即为字段value的内存偏移地址private static final lo原创 2021-01-30 16:04:56 · 368 阅读 · 0 评论 -
【并发】Java内存模型
操作系统语义硬件的效率与一致性计算机在运行程序时,每条指令都是在处理器中执行的,在执行过程中势必会涉及到数据的读写。我们知道程序运行的数据是存储在主存中,这时就会有一个问题,读写主存中的数据没有处理器中执行指令的速度快,如果任何的交互都需要与主存打交道则会大大影响效率,所以就有了处理器高速缓存。在多路处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,这种系统称为共享内存多核系统,如下图所示:有了处理器高速缓存虽然解决了效率问题,但是它会带来一个新的问题:缓存一致性。在程序运行中,原创 2020-12-24 22:24:36 · 87 阅读 · 0 评论 -
【并发】volatile详解
一. volatile语义1. 保证可见性volatile保证变量对所有线程的可见性,“可见性”是指当某个线程修改了变量的值,新值对于其他线程来说是可以立即得知的,但是volatile变量无法保证“原子性”。示例如下:public class VolatileTest { public static volatile int race = 0; private static final int THREADS_COUNT = 20; private static Count原创 2020-12-19 10:56:25 · 224 阅读 · 1 评论 -
【并发】synchronized使用
一.使用方法synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。synchronized方法通过在方法声明中加入 synchronized关键字来声明 synchronized方法,如:public synchronized void accessVal(int newVal) {}synchronized 方法控制对类成员变量的访问:每个对象实例对应一把锁,每个synchronized方法都必须获得调用该方法的对象实例的锁方能执行原创 2020-12-13 14:28:15 · 164 阅读 · 0 评论 -
【并发基础】synchronized详解
目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、...转载 2019-07-06 16:53:15 · 2835 阅读 · 0 评论 -
【并发基础】ReentrantLock详解(二)
在之前的AQS详解、Condition详解和ReentrantLock详解(一)中我们分析了同步队列、condition队列和ReentrantLock中的同步器的底层原理,最后我们通过ReentrantLock对外的接口将整个流程串一遍,思路能够更为清晰,以便对Java的并发有进一步的理解。构造方法public ReentrantLock() { sync = new Nonfair...原创 2019-07-05 10:26:35 · 138 阅读 · 0 评论 -
【并发基础】ReentrantLock详解(一)
简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。数据结构//自定义同步器,Sync为ReentrantLock的内部类,继承AbstractQueuedSynchronizerpriva...原创 2019-07-05 10:23:59 · 232 阅读 · 0 评论 -
【并发基础】Condition详解
【并发基础】Condition详解简介接口详解await()awaitUninterruptibly()awaitNanos(long nanosTimeout)、await(long time, TimeUnit unit)、awaitUntil(Date deadline)signal()signalAll()ConditionObject实现数据结构方法详解await()addConditi...原创 2019-07-05 10:18:41 · 600 阅读 · 0 评论 -
【并发基础】AQS详解
【并发基础】AQS详解简介核心数据结构自定义同步器源码解析独占式同步状态的获取和释放独占式获取tryAcquire(int)addWaiter(Node)acquireQueued(Node, int)shouldParkAfterFailedAcquire(Node, Node)parkAndCheckInterrupt小结独占式释放unparkSuccessor(Node)共享式同步状态的获取...原创 2019-07-05 10:12:22 · 339 阅读 · 0 评论