![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 93
编程菜农
看书只会让大多数新知正常的人更知道谦虚……当然,不看书只想吹牛皮也可以很开心的生活。
展开
-
ReentrantLock的lock()源码过程的分析
前言ReentTrantLock其实在jdk1.6以前相比与synchronized效率上和api丰富性上是具有很大区别,但是之后的话,其实性能上差距不大,但是在api的丰富性上ReentrantLock还是有有时那为什么在1.6前synchronzed与ReentrantLock相比,性能上差很多呢?首先当是的synchronzed在当时的需要同过操作系统的互斥量来实现锁,这就需要其在用户态和内核态上进行切换,当是直接上来就是重量级锁;但是在jdk1.6之后呢hotspot对synchroni原创 2021-01-31 00:00:09 · 226 阅读 · 0 评论 -
JUC---异步回调接口CompletableFuture
一般来说异步回调配合消息中间件使用CompletableFuture的使用public static void main(String[] args) throws ExecutionException, InterruptedException { //同步,异步,异步回调 //MQ消息中除间件 //消息中间件:实现解偶 //同步 //Void 对象代表返回对象为空 CompletableFuture&原创 2020-08-12 23:44:31 · 289 阅读 · 0 评论 -
JUC---分支合并框架使用
什么是分支合并框架呢原理:Fork:把一个复杂任务进行分拆,大事化小(黑色箭头)Join:把分拆任务的结果进行合并(蓝色箭头)相关的类:1:ForkJoinPool拆分成多个的小任务就在这个池子运行分支合并池 类比=> 线程池2:ForkJoinTask:ForkJoinTask 类比=> FutureTask同样是实现了Future接口;所以在使用ForkJoinTask.get()一样,得执行完得出结果才会的得到值3:RecursiveTas原创 2020-08-12 23:36:13 · 242 阅读 · 0 评论 -
JUC---创建线程池与自定义ThreadPool线程池
为什么使用线程池线程池的优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点为:线程复用;控制最大并发数;管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统原创 2020-08-12 22:41:50 · 203 阅读 · 0 评论 -
JUC--阻塞队列BlockingQueue的介绍和使用
阻塞队列是一个队列,在数据结构中起的作用如下图:当队列是空的,从队列中获取元素的操作将会被阻塞当队列是满的,从队列中添加元素的操作将会被阻塞试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增阻塞队列的用处:在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤起为什么需要BlockingQueue原创 2020-08-12 21:21:42 · 257 阅读 · 0 评论 -
JUC---ReentrantReadWriteLock读写锁
读锁-共享锁:比如一行数据可以被多个线程加锁,可以给很多人去读写锁-独占锁:只能一个线程支持上锁,比如一个线程对id=2上完的锁后 又对id=1进行update,但是另外个线程对id=1这行数据上了一个写锁,所以此时对id=2上写锁的线程需要灯另外对id=1这行数据上的锁解开后才能解开,所以就造成了死锁;解决方法就是说话算话,上写锁就只做写操作,读锁也是;我们自己生产环境安装的mysql死锁检测机制默认打开,如果检测到死锁会自动解开实际环境不开,因为伤性能范围锁-间隙锁:比如对id<5 id原创 2020-08-12 12:00:30 · 105 阅读 · 0 评论 -
volatile
https://www.jianshu.com/p/157279e6efdb转载 2020-08-12 11:36:17 · 78 阅读 · 0 评论 -
JUC---三个辅助类:CountDown/CyclicBarrier/Semaphore
1:CountDown(减少计数)让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。/** * * @Description: * *让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。 * * CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。 * 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), * 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。 * * 解释原创 2020-08-12 11:10:37 · 104 阅读 · 0 评论 -
JUC---callable接口实现异步调用/多线程
获取多线程的方法 有几种传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得Callable接口:1:先从写法上来看与实现runnable有啥不同1:接口需要实现的方法名不同2:callable中的call接口需要抛异常Runnable和Callable接口都是函数式接口,都能使用lambda表达式如何使用:可以看到Thread的Api,并没有可以传入Callable的方法通过FutureTask结合使用原创 2020-08-11 16:04:19 · 911 阅读 · 0 评论 -
JUC-多线程锁的范围
synchronized实现同步的基础:Java中的每一个对象都可以作 为锁。三种形式:1:对于静态同步方法,锁是当前类的Class对象。public static synchronized void xxx()静态同步方法锁的是当前类的Class对象:比如有3个Person的实例,第一个实例如果先进入了这个对象没出来,其他两个实例都无法进入这个静态同步方法,因为这个静态同步方法锁的是Class对象2::普通同步方法,其锁是当前实例对象public synchronized void x原创 2020-08-11 15:34:13 · 197 阅读 · 0 评论 -
JUC-集合类线程不安全问题
先来看:对一个ArrayList做一个并发写操作List<String> list =new ArrayList<>(); //通过多线程来证明 for (int i = 1; i <= 90; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,8));原创 2020-08-09 12:20:52 · 168 阅读 · 0 评论 -
JUC-线程间定制化通讯
默认的情况下cpu是在随机切换线程,那你邮箱多个线程可以有规律的执行,那么多线程之间需要一些协调通信;Demo:多线程按照顺序调用:A->B->C三个线程启动,要求:AA答应5次,BB答应10次,CC打印15次接着AA答应5次,BB答应10次,CC打印15次…就这样重复10轮需要线程按照这就涉及到信号量:实现:/*** 多线程按循序调用,实现A->B->C * 三个线程启动,要求: * AA答应5次,BB答应10次,CC打印15次 * 接着 * A原创 2020-08-09 10:18:44 · 199 阅读 · 0 评论 -
JUC-线程间通讯(sychronized/lock)
线程间通讯 :多个线程在处理同一个资源的时候,当线程处理的任务不同。默认的情况下cpu是在随机切换线程,那你邮箱多个线程可以有规律的执行,那么多线程之间需要一些协调通信;需要线程通信来帮助解决线程之间对同一个变量的使用或操作,就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能有效地利用资源,这种手段即——等待唤醒机制。比如我们实现实现一个线程对该变量加1,一个线程对该变量减1,* 交替,来10轮。这个就是典型的生产者+消费者+通知等待唤醒机制使用s原创 2020-08-09 00:00:33 · 108 阅读 · 0 评论 -
JUC-Lock接口替代synchronized
JUC:java.util.concurrent在并发编程中使用的工具类Lock接口java官方api中给其的解释:Lock implementations provide more extensive locking operations than can be obtained using synchronized methods and statements. They allow more flexible structuring, may have quite different pro原创 2020-08-08 23:31:11 · 150 阅读 · 0 评论 -
多线程回顾:概念
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行原创 2020-08-08 22:47:07 · 81 阅读 · 0 评论