随笔分类 - JAVA并发编程实践学习笔记
摘要:概述 Java存储模型(JMM), 安全发布、规约,同步策略等等的安全性得益于JMM ,在你理解了为什么这些机制会如此工作后,可以更容易有效地使用它们. 1. 什么是存储模型,要它何用. 如果缺少同步,就会有很多因素会导致线程 无法立即,甚至永远无法 看到另一个线程的操作所产生的结果: 编译器生成指
阅读全文
摘要:概述 java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的性能和可伸缩性.这是因为它们的内部实现使用了 原子变量和非阻塞的同步机制. 近年来很多关于并发算法的研究都聚焦在 非阻塞算法 (
阅读全文
摘要:概述: 在 "并发编程学习笔记之并发工具类(四)" 中,为大家介绍了几种同步工具(同步工具就是 依靠自己的状态,调节线程是阻塞还是运行 用的.),闭锁、FutureTask、信号量、关卡. 使用以上的同步工具大部分时候可以满足我们的需求,但是如果没能满足我们需要的功能, 可以使用语言和类库提供的底层
阅读全文
摘要:ReentrantLock(重进入锁)并不是作为内部锁(synchronized)机制的替代,而是当内部锁被证明受到局限时,提供可选择的高级特性. 1. Lock 和 ReentrantLock Lock接口: 与内部加锁机制不同,Lock提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有加
阅读全文
摘要:很多改进性能的技术增加了复杂度,因此增加了安全和活跃度失败的可能性. 更糟糕的是,有些技术的目的是改善性能,事实上产生了相反的作用,带来了其他的性能问题. 数据的正确性永远是第一位的,保证程序是正确的,然后再让它更快 .只有当你的性能需求和评估标准需要程序运行得更快时,才去进行改进. 在设计并发应用
阅读全文
摘要:死锁 每个人手里都有其他人需要的资源,自己又不会放下手上的资源,这么一直等待下去,就会发生死锁. 当一个线程永远占有一个锁,而其他线程尝试去获得这个锁,那么它们将永远被阻塞. 当线程A占有锁L时,想要获得锁M,同时线程B持有M,并尝试得到L,两个线程将永远等待下去,这种情况是死锁最简单的形式(或称致
阅读全文
摘要:等待其他资源,可能会产生线程饥饿死锁 在线程池中如果一个任务依赖于其它任务的执行,就可能产生死锁.在一个单线程化的Executor中,提交两个任务,任务二滞留在工作队列中等待第一个任务完成,但是第一个任务不会完成,因为它在等待第二个任务的完成(需要第二个任务执行的结果进行运算), 这就会发生死锁 .
阅读全文
摘要:小节 为什么 需要取消和关闭 : 有时候我们希望在任务或线程自然结束之前就停止它们,可能因为用户取消了操作,或者应用程序需要快速关闭. 取消和关闭的好处: 不会浪费资源执行一些没用的操作、保证程序的正常退出. Java没有提供任何机制,来安全地强迫线程停止手头的工作.它提供中断(线程的interru
阅读全文
摘要:单线程的缺点&使用多线程的好处 围绕执行任务来管理应用程序时,第一步要指明一个清晰的任务边界(task boundaries).理想情况下,任务是独立的活动:它的工作并不依赖于其他任务的状态、结果或者边界效应.独立有利于并发性,如果能得到相应的处理器资源,独立的任务还可以并行执行. 在正常的负载下,
阅读全文
摘要:前文回顾 上一篇博客 从零开始学多线程之组合对象(三) 主要讲解了: 1. 设计线程安全的类要考虑的因素. 2. 对于非线程安全的对象,我们可以考虑使用锁+实例限制(Java监视器模式)的方式,安全的访问它们. 3. 扩展线程安全类的四种方式. 本篇博客将要讲解的知识点 使用java提供的线程安全容
阅读全文
摘要:换了个markdown的编辑器,感觉挺方便的,但是手机端的格式显示不正确,如果读者是手机端用户,点击右上角作者主页查看,就可以了 前文回顾 通过博主之前发布的两篇博客 "从零开始学多线程之线程安全(一)" 和 "从零开始学多线程之共享对象(二)" 讲解的知识点,我们现在已经可以构建线程安全的类了,本
阅读全文
摘要:想要使用多线程编程,有一个很重要的前提,那就是必须保证操纵的是线程安全的类. 那么如何构建线程安全的类呢? 1. 使用同步来避免多个线程在同一时间访问同一数据. 2. 正确的共享和安全的发布对象,使多个线程能够安全的访问它们. 那么如何正确的共享和安全的发布对象呢? 这正是这篇博客要告诉你的. 1.
阅读全文
摘要:最近在复习、整理之前学习的多线程的知识,本着燃烧自己,照亮他人的想法,把自己整理的一些关于多线程的学习笔记、心得分享给大家. 博主准备把自己关于多线程的学习笔记写成三个部分分享给大家: 基础、实战、测试&优化 这三个部分是一环扣一环的. 1.基础: 多线程操作的对象必须是线程安全的,所以构建线程安全
阅读全文
摘要:线程安全 通过这篇博客你能学到什么: 编写线程安全的代码,本质上就管理状态的访问,而且通常是共享的、可变的状态. 状态:可以理解为对象的成员变量. 共享: 是指一个变量可以被多个线程访问 可变: 是指变量的值在生命周期内可以改变. 保证线程安全就是要在不可控制的并发访问中保护数据. 如果对象在多线程
阅读全文