随笔分类 -  并发编程

摘要:任务提交 之前在分析线程池的时候,提到过 AbstractExecutorService 的实现: 对于 submit 提交的任务,不管是 Runnable 还是 Callable,最终都会统一为 FutureTask 并传给 execute 方法。 对于 Runnable 还会创建一个适配器 : 阅读全文
posted @ 2019-01-24 21:03 Lucare 阅读(711) 评论(1) 推荐(1)
摘要:线程池的实现原理 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤 需要获取全局锁)。 2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。 3)如果无法将任务加入BlockingQueue(队列已满),则创建新 阅读全文
posted @ 2018-12-09 20:39 Lucare 阅读(490) 评论(0) 推荐(0)
摘要:遇到问题 曾今在开发的过程遇到一个问题,当时有一个服务是群发邮件的,由于一次发送几十个上百个,所以就使用了多线程来操作。 在单元测试的时候,我调了这个方法测试下邮件发送,结果总是出现莫名其妙的问题,每次都没有全部发送成功。 后来我感觉到启动的子线程都被杀掉了,好像测试方法一走完就over了,试着在测 阅读全文
posted @ 2018-07-15 12:16 Lucare 阅读(1346) 评论(0) 推荐(0)
摘要:happens-before 是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。 一、JMM 的设计 从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素: 程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模 阅读全文
posted @ 2018-07-10 09:24 Lucare 阅读(183) 评论(0) 推荐(0)
摘要:一、volatile 的内存语义1. volatile 的特性volatile变量自身具有以下特性:可见性 :对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。原子性 :对任意单个volatile变量的读/写具有原子性,但类似... 阅读全文
posted @ 2018-06-30 17:37 Lucare 阅读(793) 评论(0) 推荐(0)
摘要:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。1. 数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖... 阅读全文
posted @ 2018-06-30 16:39 Lucare 阅读(245) 评论(0) 推荐(0)
摘要:一、并发编程模型的两个关键问题1. 线程之间如何通信 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型... 阅读全文
posted @ 2018-06-24 11:52 Lucare 阅读(174) 评论(0) 推荐(0)
摘要:线程安全的实现方法 非阻塞同步 互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也成为阻塞同步。 随着硬件指令集的发展,我们有了另外一个选择: 基于冲突检测的乐观并发策略,通俗的说,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突, 阅读全文
posted @ 2017-07-16 22:50 Lucare 阅读(180) 评论(0) 推荐(0)
摘要:Java中的每一个对象都可以作为锁,具体表现为以下3种形式: - 对于普通同步方法,锁是当前实例对象 - 对于静态同步方法,锁是当前类的Class对象 - 对于同步代码块,锁是Synchronized括号里配置的对象 synchronized作用于四种类型: 1. 实例方法 2. 静态方法 3. 实 阅读全文
posted @ 2017-07-09 23:35 Lucare 阅读(142) 评论(0) 推荐(0)
摘要:任务取消 中断 线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉它在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。 public class Thread{ public void interrupt() { //...... } public static boole 阅读全文
posted @ 2017-06-25 21:13 Lucare 阅读(257) 评论(0) 推荐(0)
摘要:同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程的控制流。 阻塞队列 保存对象的容器, 还能协调生产者和消费者等线程之间的控制流 take和put等方法将阻塞,直到队列达到期望的状态(队列即非空,也非满)。 闭锁 相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线 阅读全文
posted @ 2017-06-24 22:38 Lucare 阅读(129) 评论(0) 推荐(0)
摘要:主内存与工作内存 Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。 内存间交互操作 一个变量如何从主内存拷贝到工作内存,如何从工作内存同 阅读全文
posted @ 2017-06-11 22:48 Lucare 阅读(133) 评论(0) 推荐(0)
摘要:常用容器一、ConcurrentHashMap使用一种粒度更细的加锁机制来实现更大程度的共享,这种机制称为分段锁。在这种机制中,任意数量的读取线程可以并发地访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Ma... 阅读全文
posted @ 2017-04-04 20:42 Lucare 阅读(96) 评论(0) 推荐(0)
摘要:Executor框架使用Runnable作为其基本任务表示形式。Runnable是一种有很大局限的抽象,它不能返回一个值或者抛出一个受检查的异常。但是许多任务实际上都是存在延迟的计算,比如执行数据库查询,从网络上获取资源,或者计算某个复杂的功能。对于这些任务,就要Ca... 阅读全文
posted @ 2017-03-26 20:08 Lucare 阅读(137) 评论(0) 推荐(0)
摘要:服务器应用中,串行处理机制通常无法提供高吞吐率或快速响应性。通过为每个请求创建一个新的线程来提供服务,从而实现更高的响应性。public class ThreadPerTaskWebServer { public static void main(String[... 阅读全文
posted @ 2017-03-21 18:43 Lucare 阅读(127) 评论(0) 推荐(0)