摘要:锁原理 信号量 vs 管程:JDK 为什么选择管程 [toc] 并发编程之美系列目录: 管程和信号量都能解决并发问题,它们是等价的。所谓等价指的是用管程能够实现信号量,也能用信号量实现管程。但是管程在信号量的基础上提供条件同步,使用更容易,所以 Java 采用的是管程技术。synchronized
阅读全文
摘要:并发编程 可见性、原子性和有序性问题:并发编程 Bug 的源头 [toc] 并发编程之美系列目录: 本文是并发编程的第一篇,主要介绍为什么需要并发编程,同时分析并发编程问题的根本原因 可见性、原子性和有序性三个方面。下一章我们会继续分析 JVM 是如何解决这三个问题。 1. 并发程序幕后的故事 为什
阅读全文
摘要:Java Thread系列(十)Future 模式 Future 模式适合在处理很耗时的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量。 一、Future 模式核心思想 如下的请求调用过程时序图。当 call 请求发出时,需要很长的时间才能返回。左边的图需要一直等待,等返回数据后
阅读全文
摘要:Java Thread系列(九)Master Worker模式 Master Worker模式是常用的并行设计模式. 一、Master Worker 模式核心思想 Master Worker 系统由两个角色组成,Master 和 Worker,Master 负责接收和分配任务,Worker 负责处理
阅读全文
摘要:Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer consumer problem),是一个多线程同步问题的经典案例。该问题描述了两个共亨固定大小缓冲区的线程—即所谓的“生产者”和“消费者—在实际运行时会发生的问题。 一、信号灯法 信号灯法实际上就是保证同一时间只
阅读全文
摘要:Java Thread系列(七)死锁 当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形: 线程 A 当前持有互斥所锁 lock1,线程 B 当前持有互斥锁 lock2。接下来,当线程 A 仍然持有 lock1 时,它试图获取 lock2,因为线程 B 正持有 lock2,因此线程 A 会阻塞
阅读全文
摘要:Java Thread系列(六)volatile volatile 关键字具备可见性,不具备原子性。主要作用是使变量在多个线程间可见。但不具备原子性(同步性),可以算一个轻量级的 synchronized ,性能要比 synchronized 强很多,不会造成阻塞。 一、volatile 可见性 二
阅读全文
摘要:Java Thread系列(四)线程通信 一、传统通信 public static void main(String[] args) throws InterruptedException { final ThreadLocal th = new ThreadLocal(); Thread t1 =
阅读全文
摘要:Java Thread系列(五)synchronized 本文我们讨论 synchronized 重量级锁的实现原理。 一、synchronized 实现原理 1.1 synchronized 修饰符对应的字节码指令 我们知道在 java中synchronized 主要有两种使用形式:同步方法和同步
阅读全文
摘要:Java Thread系列(三)线程安全 一、什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 线程安全来说,需要满足以下两个特性: 原子性 可见性 执行结果: 由此可见: 1. 多个线程要执行 synch
阅读全文
摘要:Java Thread系列(二)线程状态 一、线程的五种状态 1. 新建状态(New):新创建了一个线程对象,尚未启动。 2. 就绪状态(Runnable):也叫可运行状态。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用
阅读全文
摘要:Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread、实现 Runnable 接口、使用 ExecutorService、Callable、Future 实现由返回结果的多线程。 线程是 CPU 调度的最小单位。 一、继承 Thread 类创建线程类 《4
阅读全文