![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
07 高级_JUC
java.util.current学习,并发多线程
Yorick_Xu
这个作者很懒,什么都没留下…
展开
-
第一课 内存可见性问题(volatile关键字)
内存可见性问题(volatile关键字)1 内存可见性问题逐步解决(一个线程读,一个线程写)1.1 原始问题(内存可见性问题现象)1.2 通过加锁的方式解决线程可见性问题1.3 通过volatile关键字解决线程可见性问题2 原子性问题(两个线程均存在读写操作)2.1 原始问题(原子性问题现象)2.2 原子变量 Java在1.5之后的版本中加入了JUC(java.util.concurrent包) 内存可见性问题:当多个线程操作共享数据时,彼此不可见 JVM会为每一个线程分配独立的缓存用于提高效率 1原创 2020-09-08 21:46:47 · 113 阅读 · 0 评论 -
第二课 ConcurrentHashMap锁分段机制
ConcurrentHashMap锁分段机制1 HashTable的弊端2 ConcurrentHashMap锁分段机制 1 HashTable的弊端 传统的HashTable会将哈希表整体锁住,导致原本的并行操作转换成串行化操作,提高了数据的一致性,但是性能很低,由于使用锁的机制,会导致复合操作线程不安全的问题,如:“若不存在则添加”。这种复合操作需要两步操作,首先需要判断是否存在,之后进行添加操作,两个方法均存在锁机制,如果判断是否存在的方法执行权被剥夺,则会产生严重的线程安全问题 2 Concur原创 2020-09-08 21:47:17 · 224 阅读 · 0 评论 -
第三课 闭锁及Callable接口的实现
闭锁及Callable接口的实现1 闭锁2 Callable接口的实现 1 闭锁 闭锁:在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才能继续执行 package JUC; import java.util.concurrent.CountDownLatch; /** * 模拟多线程程序全线程运行结束时长 * * @author Yorick * */ public class CountDownLatchTest { // 创建countDownLatch变量时传入的5是原创 2020-09-08 21:47:51 · 80 阅读 · 0 评论 -
第四课 同步锁
同步锁1 同步锁2 生产者消费者案例——虚假唤醒2.1 引入2.2 虚假唤醒3 Condition线程通讯——生产者消费者模式升级4 线程按序交替 1 同步锁 用于解决多线程安全问题的方式 同步代码块 同步方法 同步锁(Java1.5之后),是一个显式的锁,需要通过lock()方法上锁,必须通过unlock()方法释放锁,为了保证一定执行,一般放在finally代码块中 package JUC; import java.util.concurrent.locks.Lock; import jav原创 2020-09-08 21:48:24 · 106 阅读 · 0 评论 -
第五课 线程八锁
线程八锁1 线程八锁2 线程八锁的关键 1 线程八锁 问题引入: 判断打印的是“one” 还是 “two” 1 两个普通同步方法,两个线程,标准打印 打印结果 One Two package JUC; /** * 线程八锁:第一锁——两个普通同步方法,两个线程,标准打印 * * @author Yorick * */ public class TestThreadMoniter { public static void main(String[] args) { Numbe原创 2020-09-08 21:49:00 · 78 阅读 · 0 评论 -
第六课 线程池
线程池1 线程池2 线程池的体系结构3 工具类:Excutors4 线程调度 1 线程池 提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销,提高了响应速度 2 线程池的体系结构 3 工具类:Excutors 更方便的工厂方法获取可用线程 方法名 方法解释 newFixedThreadPool(int 线程数) 创建固定大小的线程池 newCachedThreadPool() 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量 newSi原创 2020-09-08 21:49:28 · 72 阅读 · 0 评论 -
第七课 分支合并框架(Fork/Join框架)
分支合并框架(Fork/Join框架)1 工作窃取模式2 实际使用 1 工作窃取模式 当执行新的任务时,可以将其拆分成更小的任务执行,并将小任务加到线程队列中。然后再从一个随机线程的队列中偷取一个并把它放在自己的队列中。相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态。而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。那么处理该子问原创 2020-09-08 21:50:00 · 132 阅读 · 0 评论