随笔 - 1162
文章 - 0
评论 - 16
阅读 -
59万
随笔分类 - JUC
第十三章:(1)CompletableFuture异步回调
摘要:一、CompletableFuture 简介 CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。 CompletableFut
阅读全文
第十二章:(1)Fork/Join 分支合并框架
摘要:一、Fork/Join 框架简介 1、简介 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。 Fork/Join 框架要完成两件事情: Fork:把一个复杂任务进行分拆,大事化小 Join:把分拆任务的结果进行合并 任务分割:首
阅读全文
第十一章:(1)ThreadPool 线程池
摘要:一、线程池概述 1、简介 线程池(英语: thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度
阅读全文
第十章:(1)阻塞队列
摘要:一、栈与队列 常见的两种数据结构: 栈:先进后出(后进先出) 队列:先进先出 二、阻塞队列 1、BlockingQueue 简介 Concurrent 包中, BlockingQueue 很好的解决了多线程中,如何高效安全“传输” 数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的
阅读全文
第九章:(1)ReadWriteLock 读写锁
摘要:一、悲观锁与乐观锁 悲观锁:1、解决并发中各种问题2、不支持并发操作,效率很低 乐观锁:1、支持并发操作2、使用 version 版本号进行比较 二、表锁与行锁 表锁:对整张表进行加锁 行锁:对操作的行进行上锁,会发生死锁 三、读写锁 读锁:共享锁,会发生发生死锁写锁:独占锁,会发生死锁 读写锁:一
阅读全文
第八章:(3)Semaphore 信号灯
摘要:一、Semaphore 信号灯 Semaphore 的构造方法中传入的第一个参数是最大信号量(可以看成最大线程池),每个信号量初始化为一个最多只能分发一个许可证。使用 acquire 方法获得许可证, release 方法释放许可。 在信号量上我们定义两种操作: acquire(获取) 当一个线程调
阅读全文
第八章:(2)CyclicBarrier 循环栅栏
摘要:一、CyclicBarrier CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。 它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBa
阅读全文
第八章:(1)CountDownLatch减少计数
摘要:一、引入案例 假如说有6个同学在教室上自习(模拟6个线程),班长(主线程)拿着教室的钥匙,等到下课后,必须等所有的同学都离开了,班长才能锁门离开。如何实现? 普通的实现: private static void closeDoor() { for (int i = 0; i < 6; i++) {
阅读全文
第七章:(1)Callable 接口
摘要:一、创建线程的多种方式 四种 1、JDK1.5 之前,传统的方式有两种 继承 Thread 类 实现 Runnable 接口 2、JDK1.5 之后,新增了两种 使用 Callable 接口 通过线程池获取线程 二、Callable 接口 目前我们学习了有两种创建线程的方法-一种是通过创建 Thre
阅读全文
第六章:(4)死锁
摘要:一、什么是死锁 首先我们先来看看死锁的定义:“死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。”那么我们换一个更加规范的定义:“集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。”
阅读全文
第六章:(3)可重入锁与非可重入锁
摘要:一、可重入锁 可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。 可重入锁,意味着线程可以进入它已经拥有的锁的同步代码块。 Java 中的 synchronized(隐式)与Lock(显式)都是可重入锁。 二、示例 1、synchronized 同步代码块 public class
阅读全文
第六章:(2)公平锁与非公平锁
摘要:一、案例 1、售票案例 //第一步 创建资源类,定义属性和和操作方法 class LTicket { //票数量 private int number = 30; //创建可重入锁 private final ReentrantLock lock = new ReentrantLock(); //卖
阅读全文
第六章:(1)Synchronized 锁的八种情况
摘要:一、情景一 1、代码 class Phone { public synchronized void sendSMS() throws Exception { System.out.println(" sendSMS"); } public synchronized void sendEmail()
阅读全文
第五章:(3)HashMap 集合线程不安全&解决方案
摘要:一、HashMap 是不安全的 1、故障现象 public class NotSafeMapDemo { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i =
阅读全文
第五章:(2)HashSet 集合线程不安全&解决方案
摘要:一、HasheSet 集合的不安全 1、故障现象 public class NotSafeSetDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); for (int i = 0; i <
阅读全文
第五章:(1)ArrayList 集合线程不安全&解决方案
摘要:一、ArrayList 是不安全的 1、故障现象 public class NotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList(); for (int i = 0; i <
阅读全文
第四章:(1)线程间定制化通信
摘要:一、线程间定制化通信 多个线程之间的执行时机并不是固定的,是由 CPU 来操作调度的,如果要让线程按照我们需要的顺序执行,这就是线程间定制化通信。 二、案例 1、题目要求: 三个线程之间按顺序调用,实现 A -> B -> C 三个线程启动,要求如下: AA打印5次,BB打印10次,CC打印15次
阅读全文
第三章:(2)线程间通信—Lock 实现线程通信
摘要:一、Lock 接口相关 API Java 8 之前使用 synchronized,之后用 lock 锁。 二、Lock 接口实现线程通信 要求:有两个线程,实现对一个初始值是 0 的变量进行操作,一个线程对当前数值加 1,另一个线程对当前数值减 1,这两个线程交替完成效果,要求用线程间通信。 实现:
阅读全文
第三章:(1)线程间通信—Synchronized实现线程通信&虚假唤醒
摘要:一、线程间通信 线程间通信的模型有两种:共享内存 和 消息传递,以下方式都是基本这两种模型来实现的。 当调用线程 start() 方法后,是由操作系统来调度的,执行顺序是不固定的。 如果想让线程按照要求的顺序来执行,这就需要进行线程间通信。 二、多线程编程步骤(中) 第一步:创建资源类,在资源类创建
阅读全文
第二章:(2)Lock 接口
摘要:一、什么是 Lock 接口 1、Lock 接口介绍 Lock 是 java.util.concurrent.locks 包中一个接口。 java.util.concurrent.locks:为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 Lock 实现提供了比使用 synchron
阅读全文