并发编程
@java小白
Software Developer Engineer
展开
-
java并发编程 笔记十四
volatile 原理volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence)对 volatile 变量的写指令后会加入写屏障对 volatile 变量的读指令前会加入读屏障1. 如何保证可见性写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中public void actor2(I_Result r) {...原创 2020-03-21 10:54:26 · 141 阅读 · 0 评论 -
java并发编程 笔记十三
终止模式之两阶段终止模式在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。1. 错误思路使用线程对象的 stop() 方法停止线程stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁使用 System.exit(int) 方法停止线程目的仅是停止一个线程,但这种...原创 2020-03-21 10:37:34 · 242 阅读 · 0 评论 -
java并发编程 笔记十一
同步模式之顺序控制1. 固定运行顺序比如,必须先 2 后 1 打印1.1 wait notify 版 // 用来同步的对象 static Object obj = new Object(); // t2 运行标记, 代表 t2 是否执行过 static boolean t2runed = false; public static void main(...原创 2020-03-19 22:32:14 · 199 阅读 · 0 评论 -
java并发编程 笔记九
重新理解线程状态转换假设有线程 Thread t情况 1 NEW --> RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLE情况 2 RUNNABLE <--> WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用 obj.wait() 方法时,t 线程从 RUNNABLE --> WA...原创 2020-03-19 22:15:23 · 183 阅读 · 0 评论 -
java并发编程 笔记七
同步模式之保护性暂停1. 定义即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式...原创 2020-03-19 20:40:23 · 126 阅读 · 0 评论 -
java并发编程 笔记十二
Java 内存模型JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响可见性退不出的循环先来看一个现象,main...原创 2020-03-21 10:34:46 · 268 阅读 · 0 评论 -
java并发编程 笔记十
ReentrantLock相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入基本语法// 获取锁reentrantLock.lock(); try { // 临界区 } finally { // 释放锁 ...原创 2020-03-19 22:24:10 · 107 阅读 · 0 评论 -
java并发编程 笔记八
Park & Unpark基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象)特点与 Object 的 wait & notify 相比wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用...原创 2020-03-19 21:59:54 · 540 阅读 · 0 评论 -
java并发编程 笔记六
Monitor 概念Java 对象头以 32 位虚拟机为例普通对象数组对象其中 Mark Word 结构为Monitor 结构如下刚开始 Monitor 中 Owner 为 null当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monitor中只能有一个 Owner在 T...原创 2020-02-28 21:15:19 · 189 阅读 · 0 评论 -
java并发编程 笔记五
变量的线程安全分析成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用访问,它是线程安全的如果该对象逃离方法的作用范围,需要考...原创 2020-02-27 21:31:56 · 251 阅读 · 0 评论 -
java并发编程 笔记二
Java 线程方法一,直接使用 Thread// 创建线程对象Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start();方法二,使用 Runnable 配合 Thread把【线程】和【任务】(要执行的代码)分开Thread 代表线程Runnable 可运行的任务(线程要执...原创 2020-02-27 20:14:48 · 216 阅读 · 2 评论 -
java并发编程 笔记一
进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个...原创 2020-02-26 21:58:00 · 117 阅读 · 0 评论 -
java并发编程 笔记四
阻塞式的解决方案synchronized语法:synchronized(对象) // 线程1, 线程2(blocked){ 临界区}解决static int counter = 0;static final Object room = new Object();public static void main(String[] args) throws InterruptedE...原创 2020-02-27 14:37:40 · 276 阅读 · 0 评论