From 2d9238aac7bc433dd6eb8b4136e2a12cfcd50e56 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 10 Mar 2018 17:24:19 +0800 Subject: [PATCH] auto commit --- notes/Java 并发.md | 118 +++++++++++++----- pics/352dd00d-d1bb-4134-845d-16a75bcb0e02.jpg | Bin 0 -> 31744 bytes pics/38b894a7-525e-4204-80de-ecc1acc52c46.jpg | Bin 0 -> 37888 bytes pics/b02a5492-5dcf-4a69-9b5b-c2298b2cb81c.jpg | Bin 0 -> 33792 bytes 4 files changed, 85 insertions(+), 33 deletions(-) create mode 100644 pics/352dd00d-d1bb-4134-845d-16a75bcb0e02.jpg create mode 100644 pics/38b894a7-525e-4204-80de-ecc1acc52c46.jpg create mode 100644 pics/b02a5492-5dcf-4a69-9b5b-c2298b2cb81c.jpg diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 185eca50..c1f780f6 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -16,16 +16,21 @@ * [2.1 synchronized](#21-synchronized) * [2.2 Lock](#22-lock) * [2.3 BlockingQueue](#23-blockingqueue) -* [线程状态](#线程状态) +* [线程状态转换](#线程状态转换) * [结束线程](#结束线程) * [1. 阻塞](#1-阻塞) * [2. 中断](#2-中断) -* [原子性](#原子性) -* [volatile](#volatile) - * [1. 内存可见性](#1-内存可见性) - * [2. 禁止指令重排](#2-禁止指令重排) +* [Java 内存模型与线程](#java-内存模型与线程) + * [1. 硬件的效率与一致性](#1-硬件的效率与一致性) + * [2. Java 内存模型](#2-java-内存模型) + * [2.1 主内存与工作内存](#21-主内存与工作内存) + * [2.2 内存间交互操作](#22-内存间交互操作) + * [2.3 内存模型三大特性](#23-内存模型三大特性) + * [2.3.1 原子性](#231-原子性) + * [2.3.2 可见性](#232-可见性) + * [2.3.3 有序性](#233-有序性) + * [3. 未完待续](#3-未完待续) * [多线程开发良好的实践](#多线程开发良好的实践) -* [未完待续](#未完待续) * [参考资料](#参考资料) @@ -40,7 +45,6 @@ 实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。 - ## 1. 实现 Runnable 接口 需要实现 run() 方法 @@ -337,18 +341,30 @@ Producer3 is consuming product made by Consumer3... Producer4 is consuming product made by Consumer4... ``` -# 线程状态 +# 线程状态转换 -JDK 从 1.5 开始在 Thread 类中增添了 State 枚举,包含以下六种状态: +1. NEW(新建):创建后尚未启动的线程。 +2. RUNNABLE(运行):处于此状态的线程有可能正在执行,也有可能正在等待着 CPU 为它分配执行时间。 +3. BLOCKED(阻塞):阻塞与等待的区别是,阻塞在等待着获取到一个排它锁,这个时间将在另一个线程放弃这个锁的时候发生;而等待则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种状态。 +4. Waiting(无限期等待):处于这种状态的进行不会被分配 CPU 执行时间,它们要等待其它线程显示地唤醒。以下方法会让线程进入这种状态: +5. TIMED_WAITING(限期等待):处于这种状态的线程也不会被分配 CPU 执行时间,不过无序等待其它线程显示地唤醒,在一定时间之后它们会由系统自动唤醒。 +6. TERMINATED(死亡) -1. **NEW** (新建) -2. **RUNNABLE** (当线程正在运行或者已经就绪正等待 CPU 时间片) -3. **BLOCKED** (阻塞,线程在等待获取对象同步锁) -4. **Waiting** (调用不带超时的 wait() 或 join()) -5. **TIMED_WAITING** (调用 sleep()、带超时的 wait() 或者 join()) -6. **TERMINATED** (死亡) +以下方法会让线程陷入无限期的等待状态: -
sUORCQ+
z)%5jn9cg6KrOJ*|k$NMVnQCVKL9R^W2d=TwMz!-*8Voc4wN(GxyG@XjZ;wH<`uyDN
z%+*Vu{S{s#d-I8SIBAr8@wI23Xw*QuvgFp!rq2=$k703phNok6J5mTDP~YJvmQT+R
z-&nep *rBCG~)q@8-Qc%m@%%M*^BmK;b^Xy2){oDa_oT$pKEuD}Y6G5{+{NoN3^QDuGv
z@b+TazoF&@V^{W)n^MskJ^}qG56|PeCf{a+;zARBav%joxiNsmpET)C*n@m0aymtH
zgSRtL9+vu8BY EfVAOqu`aH+R;@
z`5S6WP+L3#<@VH}J)0e=vas>ZT=(fK@Lwx%?rd;S5!MhUyR{85VzF3Qlrn5qHm|cD
ztfdT6wn8twD`L(`62va<3w}KU
z`Yger?O{)
f^#G&U!{ofKykHwsj@VqTr^21V91`Qv!%<2f$UbaMyb8>S`V
zQ)P&*y}uxn_XUOkf_rj2lGJlSwR(G;Rc*7Otj%n5pu1iti1omLs|8dSV)bNtwS9ju
zUuA@_|2Guc3rraW(RZ+X*~BVd#EVZHQqRNXa7~A1^Iv?5K?-5np4|Y58$lOJ@>x-`
zY+=fFHomNzRaea1-kmiNBXbQO!`G|jdqs>JPGxu7)U_o
k|V;Xx;UIqPAYU-T?)k
zDy!!bWUl>skUcWrH`xD3O2X3hAwwAXC6Ka+j-5pDwh^h5q|WfFS^HmABiU|ZDfNWC
z3Vl5bl8U$h$ms2I?90W?>S=yAA6RLN`{wzIP9J7ne@dG&4s8&Oq?+TwSCCB3iI3qs
zp7%R6Ve`MeG-mW`ym5JHf@?+^nlLBjebEf0jrSALieb0&LUcE#{*iud2QbBR{vf|$+j0-U3nm1#=j&f(4mPa!%cO!
zR*M0ZmXi&XR^=
o$1>MXABW#eyK0@PExVX6M}#ok&1tchS|g~4S&B}}L4#=SijDcztzZ}U4y
zZhX+BbWhG0FVMMAdwuJ`XT_$?%rWGmb@mfm)^xkG5l#Xz=XfqPK)!tN)TAO>VRgm}
zZsj|CkRqpQ-dkq7h`zRF7z1o&V#aG*YEwjOQXG#