
JUC
文章平均质量分 77
fFee-ops
it's tough.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
乐观锁、悲观锁
乐观锁、悲观锁基本概念实现方式优缺点和适用场景基本概念乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。实现方式乐观锁和悲观锁是两种思想,它们的使用是非常广泛的原创 2021-02-09 22:29:06 · 191 阅读 · 0 评论 -
AQS详解
AQS详解前置知识可重入锁Synchronized的重入的实现机理LockSupport线程等待唤醒机制(wait/notify)Object类中的wait和notify方法实现线程等待和唤醒Condition接口中的await后signal方法实现线程的等待和唤醒LockSupport类中的park等待和unpark唤醒重点说明这块儿的面试题前置知识可重入锁可重入锁又名递归锁是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获原创 2021-01-09 10:38:28 · 2173 阅读 · 1 评论 -
CompletableFuture
CompletableFuture是什么runAsync 和 supplyAsync方法计算结果完成时的回调方法代码是什么在Java中CompletableFuture用于异步编程,异步编程是编写非阻塞的代码,运行的任务在一个单独的线程,与主线程隔离,并且会通知主线程它的进度,成功或者失败。在这种方式中,主线程不会被阻塞,不需要一直等到子线程完成。主线程可以并行的执行其他任务。使用这种并行方式,可以极大的提高程序的性能。Future vs CompletableFuture:Completabl原创 2020-10-08 14:45:04 · 281 阅读 · 0 评论 -
分支合并框架
分支合并框架ForkJoin原理相关类示例原理Fork:把一个复杂任务进行分拆,大事化小Join:把分拆任务的结果进行合并相关类ForkJoinPool: 分支合并池 类比=> 线程池ForkJoinTask: ForkJoinTask 类比=> FutureTaskRecursiveTask: 递归任务:继承后可以实现递归(自己调自己)调用的任务示例package cduck.cn;import java.util.concurrent.Execut原创 2020-10-08 13:32:56 · 341 阅读 · 0 评论 -
ThreadPool线程池
ThreadPool线程池为什么要用线程池线程池如何使用编码实现:线程池7大重要参数线程池底层工作原理线程池用哪个?生产中如设置合理参数线程池的拒绝策略在工作中单一的/固定数的/可变的三种创建线程池的方法哪个用的多?超级大坑代码为什么要用线程池例子:10年前单核CPU电脑,假的多线程,像马戏团小丑玩多个球,CPU需要来回切换。现在是多核电脑,多个线程各自跑在独立的CPU上,不用切换,效率高。线程池的优势: 线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,原创 2020-10-07 13:15:15 · 2351 阅读 · 0 评论 -
BlockingQueue 阻塞队列
BlockingQueue 阻塞队列阻塞队列阻塞队列的用处BlockingQueue的架构图种类分析BlockingQueue核心方法代码阻塞队列阻塞:必须要阻塞/不得不阻塞 阻塞队列是一个队列,在数据结构中起的作用如下:线程1往阻塞队列里添加元素,线程2从阻塞队列里移除元素当队列是空的,从队列中获取元素的操作将会被阻塞。当队列是满的,从队列中添加元素的操作将会被阻塞。试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素。试图向已满的队列中添加新元素的线程将会被阻塞,原创 2020-10-06 23:36:38 · 264 阅读 · 0 评论 -
ReentrantReadWriteLock 读写锁
ReentrantReadWriteLock读写锁示例虽然平常的加锁能保证数据一致性,但是呢,效率很低,你写的时候是加锁了,但是加的太死了:就比如你在写,你不准别人来写没问题,但是你在写的时候都不准别人看!那么效率就会很低下,于是读写锁(只允许一个人写,但是允许多个人读)便出来了。示例package cduck.cn;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeUnit;impor原创 2020-10-06 22:46:09 · 153 阅读 · 0 评论 -
CountDownLatch/CyclicBarrier/Semaphore
JUC强大的辅助类CountDownLatch减少计数CyclicBarrier循环栅栏Semaphore信号灯CountDownLatch减少计数原理CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。例子package cduck.cn;import java.util.con原创 2020-10-04 17:59:46 · 201 阅读 · 0 评论 -
NotSafeDemo
NotSafeDemo需求线程不安全的错误原理解决方案例子ListNotSafe()SetNotSafe()MapNotSafe()需求请举例说明集合类是不安全的线程不安全的错误java.util.ConcurrentModificationException ArrayList在迭代的时候如果同时对其进行修改就会抛出并发修改异常.原理看ArrayList的源码public boolean add(E e){ ensureCapacityInternal(size+1)原创 2020-10-04 17:15:43 · 193 阅读 · 0 评论 -
多线程8锁
多线程8锁题目代码题目在AA线程执行的代码下面有一行Thread.sleep(100);保证了这个题目中的AA能先抢到执行权1 标准访问,先打印短信还是邮件短信2 停4秒在短信方法内,先打印短信还是邮件短信一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待。换句话说,某一个时刻内,只能有唯一 一个线程(当前对象this)去访问这些synchronized方法锁,被锁定后,其它的线程都不能进入原创 2020-10-02 23:11:29 · 205 阅读 · 0 评论 -
线程间通信(生产者消费者模型)
线程间通信生产者消费者复习发生问题解决生产者消费者复习package cduck.cn;/** * 题日:现在两个线程,可以操作初始值为零的一个交量, * 实现一个线程对该变量加,一个线程对该变量减1, * 实现交替,来10轮,变量初始值为0。 * * 1、高内聚低耦合前提下,线程操作资源类 * 2、判断/干活/通知 * 3、防止虚假唤醒,只能用WHILE循环 */class SharingResource{//资源类 private int num=0; p原创 2020-10-02 14:21:46 · 224 阅读 · 0 评论 -
复习卖票问题
复习卖票问题LOCK接口Lock接口的实现ReentrantLock可重入锁代码LOCK接口是什么:锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。Lock接口的实现ReentrantLock可重入锁class X { private final ReentrantLock lock = new ReentrantLock(); public void main() { lock.lock原创 2020-09-30 22:06:22 · 322 阅读 · 0 评论