Java高并发
薰衣草的味道
这个作者很懒,什么都没留下…
展开
-
玩转高并发系列----JUC并发工具类(二)
在前一章节我们详细分析了Semaphore以及CountDownLatch的基本用法及实现原理,并且在将CountDownLatch时,也举了一个运动员赛跑的栗子。下面我将接着这个栗子详细分析CyclicBarrier的基本用法及底层实现原理。CyclicBarrier顾名思义,是一个可被循环使用的屏障。在前一章讲述CountDownLatch的时候说道,CountDownLatch可以用在等待指定的线程数执行完成,即到达一个指定的时间节点后,同时开始其他的任务。而CyclicBarrier在其上做了原创 2020-08-12 23:15:46 · 133 阅读 · 0 评论 -
玩转高并发系列----JUC并发工具类(一)
在这一章节中,我将详细讲解JUC中提供的一些常用的并发工具类的使用,如CountDownLatch, Semaphore,ThreadLocal,CyclicBarrier等进行逐一讲解,并通过一行一行品源码的方式来逐步探索多线程的奥秘。CountDownLatch...原创 2020-08-10 23:57:56 · 285 阅读 · 0 评论 -
玩转高并发系列----锁(三)
这一章我们将着重讲解Condition的基本用法以及其实现原理,让读者不光知其然,更知其所以然。并且将带领大家一行一行通过源码的方式剖析其实现细节。基本用法Condition本身是一个接口,其功能和用法类似wait()和notify()。并且在使用Condition时,必须和Lock一起使用,即必须获取到Condition对应的lock锁之后,才能调用Condition的阻塞(await)和唤醒(signal)方法。先看一下Condition的接口声明。public interface Condi原创 2020-08-08 02:34:40 · 179 阅读 · 0 评论 -
玩转高并发系列----锁(二)
这一章,我将结合JDK源码详细介绍如何通过AQS实现了读写锁以及如何通过Unsafe的park()和unpark()方法并结合条件队列实现Condition。读写锁(ReentrantReadWriteLock)1 读写锁的基本用法:首先我们看一看读写的基本用法:顾名思义,读写锁,就是能够保证读写分离,在高并发情况下,做到读读不互斥,读写互斥,写写互斥,从而提高并发量。读写锁也是基于AQS实现的,通过AQS内部的state变量,同时记录的读线程的个数和写线程的个数(因为是可重入的,对于写线程的原创 2020-08-05 22:47:10 · 193 阅读 · 0 评论 -
玩转高并发系列----锁(一)
锁的基本概念可重入锁:指当一个线程获得锁A,进入互斥区域后,可以再次获取到锁A。而不是说一个线程获得锁A之后,还可以进入锁B。很显然,通常的锁都要设计成可重入的,否则就会发生死锁。 如下代码展示了锁的可重入性:private int value;private Lock lock = new ReentrantLock();public void increment(){ try { lock.lock(); lock.lock(); va原创 2020-08-03 23:52:53 · 150 阅读 · 0 评论 -
玩转高并发系列----原子类型(一)
原子类型的意义对于一个共享变量,在多线程的情况下,我们需要对其进行同步操作,最常用的手段是添加synchronized关键字。如public class SharedValue { private int value; public synchronized void add(int count){ this.value += count; } public synchronized void sub(int count) { this.原创 2020-08-02 22:03:41 · 126 阅读 · 0 评论 -
玩转高并发系列----多线程基础(二)
volatile关键字多线程中的三个重要特性:原子性:指的是一个读/写操作可以当做是一个原子操作。如赋值操作等。注意点:JVM的规范并没有要求64位的long或者double的写入是原子的。因此,在32位的机器上,一个64位变量的写入可能被拆分成两个32位的写操作来执行。这样可能读线程只能读到写线程写入的“一半”的值。内存可见性:指的是“写完之后立即对其他线程可见”,它的反面不是“不可见”,而是“稍后才能见”,也就是volatile保证了强一致性。如上一节的示例代码中,线程关闭原创 2020-07-31 22:41:29 · 148 阅读 · 0 评论 -
玩转高并发系列----多线程基础(一)
如何优雅的关闭线程运行到一半的线程能否强制杀死?肯定是不能的。因为如果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等资源就无法正常关闭。一个线程一旦运行起来,就不要去强行打断它,合理的关闭方法是让其运行完(也就是线程执行结束),释放所有的资源后,退出线程。所以Java中不建议使用stop()和destory()方法。设置守护线程,使得所有非守护线程执行结束后,守护线程自动优雅关闭。如经典的JVM中的垃圾回收线程。设置关闭的标志位。如下所示/*** 执行结果如下:*原创 2020-07-30 23:38:26 · 190 阅读 · 0 评论 -
CompletableFuture踩坑记
使用CompletableFuture踩的坑坑才是重点,所以放在最前面阐述,希望能给大家解决问题提供一点帮助。现象通过CompletabltableFuture异步执行任务,并通过其whenComplete方法设置异步回调后,在回调方法中将值插入list或map中,结果发现获取不到回调方法中的值public class CompletableFutureDemo02 { /...原创 2020-04-15 22:07:21 · 8177 阅读 · 2 评论