java并发编程读书笔记
tobebetter9527
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
34. WorkerThread模式:如何避免重复创建线程?-并发设计模式 - 待完成
文章目录1. Worker Thread模式及其实现1. Worker Thread模式及其实现原创 2019-11-03 10:38:01 · 336 阅读 · 1 评论 -
33. Thread-Per-Message模式:最简单实用的分工方法 -并发设计模式 - 待完成
文章目录1. 如何理解Thread-Per-Message模式2. 用Thread实现Thread-Per-Message模式解决并发编程问题,首要问题也是解决宏观的分工问题。1. 如何理解Thread-Per-Message模式委托他人处理,简而言之,就是为每个任务分配一个独立的线程。2. 用Thread实现Thread-Per-Message模式...原创 2019-11-03 10:27:55 · 209 阅读 · 1 评论 -
32. Balking模式:再谈线程安全的单例模式 - 并发设计模式 - 待完成
文章目录1. 场景1. 场景编辑器提供的自动保存功能需要快速放弃:隔一定时间自动执行存盘操作,如果文件没有执行过修改操作,就需要快速放弃存盘操作。...原创 2019-10-31 23:53:49 · 229 阅读 · 0 评论 -
31. GuardedSuspension模式:等待唤醒机制的规范实现 - 并发设计模式
文章目录1. 场景2. Guarded Suspension模式1. 场景Web版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,发送消息和消费结果这两个操作之间是异步的。class Message { ...原创 2019-10-28 21:45:04 · 286 阅读 · 0 评论 -
30. 线程本地存储模式:没有共享,就没有伤害 - 并发设计模式
文章目录1. ThreadLocal的使用方法多个线程同时读写同一共享变量存在并发问题, 避免共享,就能避免并发问题。1. ThreadLocal的使用方法原创 2019-10-27 23:02:14 · 261 阅读 · 0 评论 -
29. Copy-on-Write模式:不是延时策略的COW - 并发设计模式
文章目录1. Copy-on-Write模式的应用领域2. 一个真实案例3. 总结4. 课后思考Copy-on-Write,缩写为COW或者CoW,顾名思义就是写时复制。1. Copy-on-Write模式的应用领域操作系统Unix创建进程的API是fork(),会创建父进程的一个完整副本,如父进程占用1G内存,fork()子进程要复制父进程的整个内存,非常耗时;Linux系统fork...原创 2019-10-27 22:43:35 · 712 阅读 · 0 评论 -
28. Immutability模式:如何利用不变性解决并发问题?- 并发设计模式
文章目录1. 快速实现具备不可变性的类2. 利用享元模式避免创建重复对象解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。由此,不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化1. 快速实现具备不可变性的类实现方法:将一个类所有的属性都设置成final的,并且只允许存在只读方法,那么这个类基本上就具备不可变性,更严格...原创 2019-10-27 18:31:53 · 498 阅读 · 0 评论 -
27. 并发工具类模块热点问题答疑 - 并发工具类
文章目录// TODO 待看原创 2019-10-27 15:29:22 · 325 阅读 · 0 评论 -
26. ForkJoin:单机版的MapReduce - 并发工具类
文章目录1. 分治任务模型2. Fork/Join的使用对于简单的并行任务,你可以通过“线程池+Future”的方案来解决;如果任务之间有聚合关系,无论是AND聚合还是OR聚合,都可以通过CompletableFuture来解决;而批量的并行任务,则可以通过CompletionService来解决。分治,即分而治之,是一种解决复杂问题的思维方法和模式;具体来讲,指的是把一个复杂的问题分解成多个...原创 2019-10-27 13:32:20 · 570 阅读 · 0 评论 -
25. CompletionService:如何批量执行异步任务? - 并发工具类
文章目录1. 利用CompletionService实现询价系统一个采用“ThreadPoolExecutor+Future”的方案询价应用方案,如下:// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 异步向电商S1询价Future<Integer> f1 = executor.s...原创 2019-10-26 23:51:40 · 707 阅读 · 0 评论 -
24. CompletableFuture:异步编程没那么难 - 并发工具类
文章目录1. CompletableFuture的核心优势2. 创建CompletableFuture对象3. 如何理解CompletionStage接口1. CompletableFuture的核心优势利用CompletableFuture实现前面的泡茶程序。分工,任务1负责洗水壶、烧开水,任务2负责洗茶壶、洗茶杯和拿茶叶,任务3负责泡茶。其中任务3要等待任务1和任务2都完成后才能开始。...原创 2019-10-26 18:01:02 · 649 阅读 · 0 评论 -
23. Future:如何用多线程实现最优的“烧水泡茶”程序?- 并发工具类
文章目录1. 如何获取任务执行结果1. 如何获取任务执行结果ThreadPoolExecutor提供的3个submit()方法和1个FutureTask工具类来支持获得任务执行结果的需求。方法签名如下:// 提交Runnable任务Future<?> submit(Runnable task);// 提交Callable任务<T> Future<T>...原创 2019-10-24 23:45:32 · 887 阅读 · 0 评论 -
22. Executor与线程池:如何创建正确的线程池?- 并发工具类
文章目录线程是一个重量级的对象,应该避免频繁创建和销毁。原创 2019-10-23 23:11:56 · 305 阅读 · 0 评论 -
21. 原子类:无锁工具类的典范 - 并发工具类
文章目录1. 无锁方案的实现原理2. 看 Java 如何实现原子化的 count += 1public class Test { AtomicLong count = new AtomicLong(0); void add10K() { int idx = 0; while (idx++ < 10000) { count.getAndIncrement(); } ...原创 2019-10-22 23:03:20 · 421 阅读 · 0 评论 -
20. 并发容器:都有哪些坑需要我们填?- 并发工具类
文章目录1. 同步容器及其注意事项1. 同步容器及其注意事项原创 2019-10-20 23:48:51 · 242 阅读 · 0 评论 -
19. CountDownLatch和CyclicBarrier:如何让多线程步调一致?- 并发工具类
文章目录1. 对账模型介绍2. 利用并行优化对账系统3. 用CountDownLatch 实现线程等待4. 进一步优化性能5. 用 CyclicBarrier 实现线程同步5. 总结1. 对账模型介绍对账系统的运行逻辑用户通过在线商城下单,会生成电子订单,保存在订单库;之后物流会生成派送单给用户发货,派送单保存在派送单库;为了防止漏派送或者重复派送,对账系统每天还会校验是否存在异常订单...原创 2019-10-20 22:40:25 · 347 阅读 · 0 评论 -
18. StampedLock:有没有比读写锁更快的锁?- 并发工具类
文章目录1. StampedLock 支持的三种锁模式2. 进一步理解乐观读3. StampedLock 使用注意事项StampedLock 性能比读写锁更好1. StampedLock 支持的三种锁模式三种模式:写锁、悲观读锁和乐观读。其中,写锁、悲观读锁的语义和 ReadWriteLock 的写锁、读锁的语义非常类似,允许多个线程同时获取悲观读锁,但是只允许一个线程获取写锁,写锁和悲观读...原创 2019-10-20 11:35:58 · 585 阅读 · 0 评论 -
17. ReadWriteLock:如何快速实现一个完备的缓存?- 并发工具类
文章目录1.那什么是读写锁呢?管程和信号量这两个同步原语,理论上可以解决所有的并发问题,Java SDK 还有很多其他的工具类的原因:分场景优化性能,提升易用性。一种并发场景:读多写少,例如缓存。Java SDK 并发包提供了读写锁——ReadWriteLock。1.那什么是读写锁呢?...原创 2019-10-14 23:01:10 · 263 阅读 · 0 评论 -
16. Semaphore:如何快速实现一个限流器?- 并发工具类
文章目录1. 信号量模型Semaphore,翻译为“信号量”。首先介绍信号量模型,之后介绍如何使用信号量,最后我们再用信号量来实现一个限流器。1. 信号量模型...原创 2019-10-13 23:43:20 · 938 阅读 · 0 评论 -
15. Lock和Condition(下):Dubbo如何用管程实现异步转同步?- 并发工具类
文章目录1. 如何利用两个条件变量快速实现阻塞队列呢?Condition 实现了管程模型里面的条件变量。Java 语言内置的管程里只有一个条件变量,而 Lock&Condition 实现的管程是支持多个条件变量的,这是二者的一个重要区别。1. 如何利用两个条件变量快速实现阻塞队列呢?...原创 2019-10-13 19:03:27 · 540 阅读 · 0 评论 -
14. Lock&Condition(上):隐藏在并发包中的管程 - 并发工具类
文章目录1. 再造管程的理由并发编程的两个核心问题:互斥,同个时刻只有有一个线程;同步,线程之间如何通信,协作。Lock和Conditon两个接口实现管程,其中Lock实现互斥,Condition实现同步。java已经有synchronized实现管程,为什么要重复造轮子呢?他们有什么区别?1. 再造管程的理由...原创 2019-10-08 20:55:20 · 333 阅读 · 0 评论 -
13. 理论基础模块热点问题答疑 - 理论基础
文章目录1. 待补// TODO 待补1. 待补原创 2019-10-08 20:43:43 · 175 阅读 · 0 评论 -
12. 如何用面向对象思想写好并发程序?- 理论基础
文章目录1. 封装共享变量1. 封装共享变量原创 2019-10-07 17:49:48 · 528 阅读 · 0 评论 -
11. Java线程(下):为什么局部变量是线程安全的?- 理论基础
文章目录1. 方法是如何被执行的2. 局部变量存哪里?3. 调用栈与线程4. 线程封闭局部变量是否存在并发问题?在CPU层面,是没有方法概念的,只有一条条的指令,编译程序就是把高级语言编译成一条条指令。1. 方法是如何被执行的代码int a = 7;int[] b = fibonacci(a);int[] c = b;方法的调用过程:每个方法在调用栈里都有自己的独立空间,称为...原创 2019-10-07 17:46:23 · 1053 阅读 · 0 评论 -
10. Java线程(中):创建多少线程才是合适的?- 理论基础
文章目录1. 为什么要使用多线程2. 多线程的应用场景3. 最佳线程数量首先解决两个问题:为什么要使用多线程?多线程的应用场景有哪些?1. 为什么要使用多线程本质上是提升程序性能,有两个最核心的指标,延迟和吞吐量。2. 多线程的应用场景提高I/O和CPU利用率。3. 最佳线程数量最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)]...原创 2019-10-07 16:05:15 · 308 阅读 · 0 评论 -
9. Java线程(上):java线程的生命周期 - 理论基础
文章目录1. 通用的线程生命周期1. 通用的线程生命周期原创 2019-10-07 11:05:16 · 361 阅读 · 0 评论 -
8.管程:并发编程的万能钥匙 - 理论基础
文章目录1. 什么是管程1. 什么是管程英文Monitor,管理共享变量以及对共享变量的操作过程。在java当中,就是管理成员变量和成员方法。原创 2019-10-05 18:14:31 · 331 阅读 · 0 评论 -
7. 安全性、活跃性以及性能问题 -理论基础
文章目录1. 安全性问题2. 活跃性问题3. 性能问题1. 安全性问题线程安全:程序按照我们的期望执行,不出现意外情况。数据竞争(data race): 多个线程同时访问同一数据,并且至少有一个线程会写这个数据.竞态条件(Race Condition): 程序的执行结果依赖线程的执行顺序。如下:if (状态变量 满足 执行条件) { 执行操作}当某个线程发现状态变量满足执行条件...原创 2019-10-05 17:36:41 · 246 阅读 · 0 评论 -
6. 用“等待-通知”机制优化循环等待 - 理论基础
文章目录上一章破坏占有且等待的条件,用到死循环的方式:// 一次性申请转出账户和转入账户,直到成功while (!actr.apply(this, target));原创 2019-10-05 11:53:09 · 263 阅读 · 0 评论 -
5. 一不小心就死锁了,怎么办?- 理论基础
文章目录1. 用两把锁上一篇文章中,我们用Account.class作为互斥锁,虽然不会有并发问题,但导致所有账户的操作都是串行,性能严重降低。1. 用两把锁class Account { private int balance; // 转账 void transfer(Account target, int amt) { // 锁定转出账户 synchronized (t...原创 2019-10-04 22:07:02 · 228 阅读 · 0 评论 -
4. 互斥锁(下):如何用一把锁保护多个资源 - 理论基础
文章目录1. 保护没有关联关系的多个资源2. 保护有关联关系的资源3. 正确使用锁保护多个资源4.总结1. 保护没有关联关系的多个资源各自创建自己锁保护即可,如下:class Account { // 锁:保护账户余额 private final Object balLock = new Object(); // 账户余额 private Integer balance; // 锁...原创 2019-10-04 19:57:21 · 389 阅读 · 0 评论 -
3. 互斥锁(上): 解决原子性问题 - 理论基础
文章目录1.1.原创 2019-10-03 15:22:36 · 240 阅读 · 0 评论 -
2. java内存模型:看java如何解决可见性和有序性问题 - 理论基础
文章目录1. 什么是java内存模型1. 什么是java内存模型原创 2019-10-02 22:19:25 · 285 阅读 · 0 评论 -
1. 可见性、原子性和有序性问题:并发编程bug源头 - 理论基础
文章目录sdfa原创 2019-10-01 15:55:33 · 548 阅读 · 0 评论 -
并发编程的三个核心问题
原创 2019-10-01 15:29:03 · 464 阅读 · 0 评论
分享