下图左侧是一个线程的虚拟机栈,其中有一部分称为 Lock Record 的区域,这是在轻量级锁运行过程创建的,用于存放锁对象的 Mark Word。而右侧就是一个锁对象,包含了 Mark Word 和其它信息。
-
+
轻量级锁是相对于传统的重量级锁而言,它使用 CAS 操作来避免重量级锁使用互斥量的开销。对于绝大部分的锁,在整个同步周期内都是不存在竞争的,因此也就不需要都使用互斥量进行同步,可以先采用 CAS 操作进行同步,如果 CAS 失败了再改用互斥量进行同步。
当尝试获取一个锁对象时,如果锁对象标记为 0 01,说明锁对象的锁未锁定(unlocked)状态。此时虚拟机在当前线程的虚拟机栈中创建 Lock Record,然后使用 CAS 操作将对象的 Mark Word 更新为 Lock Record 指针。如果 CAS 操作成功了,那么线程就获取了该对象上的锁,并且对象的 Mark Word 的锁标记变为 00,表示该对象处于轻量级锁状态。
-
+
如果 CAS 操作失败了,虚拟机首先会检查对象的 Mark Word 是否指向当前线程的虚拟机栈,如果是的话说明当前线程已经拥有了这个锁对象,那就可以直接进入同步块继续执行,否则说明这个锁对象已经被其他线程线程抢占了。如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁。
@@ -1743,8 +1864,6 @@ JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态:
当有另外一个线程去尝试获取这个锁对象时,偏向状态就宣告结束,此时撤销偏向(Revoke Bias)后恢复到未锁定状态或者轻量级锁状态。
-
-
需要注意的是,偏向锁在 JDK 15 中被默认禁用并废弃(JEP 374),JDK 18 起相关参数已不再生效。
## 十三、多线程开发良好的实践
@@ -1775,7 +1894,7 @@ JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态:
- [Java 线程面试题 Top 50](http://www.importnew.com/12773.html)
- [BlockingQueue](http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html)
- [thread state java](https://stackoverflow.com/questions/11265289/thread-state-java)
-- [CSC 456 Spring 2012/ch7 MN](http://wiki.expertiza.ncsu.edu/index.php/CSC_456_Spring_2012/ch7_MN)
+- [CSC 456 Spring 2012/ch7 MN](https://web.archive.org/web/20250417190245/https://wiki.expertiza.ncsu.edu/index.php/CSC_456_Spring_2012/ch7_MN)
- [Java - Understanding Happens-before relationship](https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html)
- [6장 Thread Synchronization](https://www.slideshare.net/novathinker/6-thread-synchronization)
- [How is Java's ThreadLocal implemented under the hood?](https://stackoverflow.com/questions/1202444/how-is-javas-threadlocal-implemented-under-the-hood/15653015)
@@ -1783,3 +1902,5 @@ JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态:
- [JAVA FORK JOIN EXAMPLE](http://www.javacreed.com/java-fork-join-example/ "Java Fork Join Example")
- [聊聊并发(八)——Fork/Join 框架介绍](http://ifeve.com/talk-concurrency-forkjoin/)
- [Eliminating SynchronizationRelated Atomic Operations with Biased Locking and Bulk Rebiasing](http://www.oracle.com/technetwork/java/javase/tech/biasedlocking-oopsla2006-preso-150106.pdf)
+- [JEP 374: Deprecate and Disable Biased Locking](https://openjdk.org/jeps/374)
+- [markOop.hpp | OpenJDK jdk8u](https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/oops/markOop.hpp)
diff --git a/notes/pics/jc-atomic-cas.png b/notes/pics/jc-atomic-cas.png
new file mode 100644
index 00000000..5b68499a
Binary files /dev/null and b/notes/pics/jc-atomic-cas.png differ
diff --git a/notes/pics/jc-cnt-race.png b/notes/pics/jc-cnt-race.png
new file mode 100644
index 00000000..d1e0f548
Binary files /dev/null and b/notes/pics/jc-cnt-race.png differ
diff --git a/notes/pics/jc-countdownlatch.png b/notes/pics/jc-countdownlatch.png
new file mode 100644
index 00000000..42db01ff
Binary files /dev/null and b/notes/pics/jc-countdownlatch.png differ
diff --git a/notes/pics/jc-cpu-cache.png b/notes/pics/jc-cpu-cache.png
new file mode 100644
index 00000000..ab1707b5
Binary files /dev/null and b/notes/pics/jc-cpu-cache.png differ
diff --git a/notes/pics/jc-cyclicbarrier.png b/notes/pics/jc-cyclicbarrier.png
new file mode 100644
index 00000000..d648ece8
Binary files /dev/null and b/notes/pics/jc-cyclicbarrier.png differ
diff --git a/notes/pics/jc-hb-join.png b/notes/pics/jc-hb-join.png
new file mode 100644
index 00000000..7ac8279f
Binary files /dev/null and b/notes/pics/jc-hb-join.png differ
diff --git a/notes/pics/jc-hb-monitor.png b/notes/pics/jc-hb-monitor.png
new file mode 100644
index 00000000..8be8854a
Binary files /dev/null and b/notes/pics/jc-hb-monitor.png differ
diff --git a/notes/pics/jc-hb-program-order.png b/notes/pics/jc-hb-program-order.png
new file mode 100644
index 00000000..40ae5334
Binary files /dev/null and b/notes/pics/jc-hb-program-order.png differ
diff --git a/notes/pics/jc-hb-start.png b/notes/pics/jc-hb-start.png
new file mode 100644
index 00000000..40f9421a
Binary files /dev/null and b/notes/pics/jc-hb-start.png differ
diff --git a/notes/pics/jc-hb-volatile.png b/notes/pics/jc-hb-volatile.png
new file mode 100644
index 00000000..9b36c673
Binary files /dev/null and b/notes/pics/jc-hb-volatile.png differ
diff --git a/notes/pics/jc-jmm-ops.png b/notes/pics/jc-jmm-ops.png
new file mode 100644
index 00000000..decc984c
Binary files /dev/null and b/notes/pics/jc-jmm-ops.png differ
diff --git a/notes/pics/jc-jmm.png b/notes/pics/jc-jmm.png
new file mode 100644
index 00000000..9db572be
Binary files /dev/null and b/notes/pics/jc-jmm.png differ
diff --git a/notes/pics/jc-threadlocal.png b/notes/pics/jc-threadlocal.png
new file mode 100644
index 00000000..fab25269
Binary files /dev/null and b/notes/pics/jc-threadlocal.png differ
diff --git a/notes/pics/jc-work-stealing.png b/notes/pics/jc-work-stealing.png
new file mode 100644
index 00000000..9502efd5
Binary files /dev/null and b/notes/pics/jc-work-stealing.png differ
diff --git a/notes/pics/lock-record.png b/notes/pics/lock-record.png
new file mode 100644
index 00000000..b88a03fd
Binary files /dev/null and b/notes/pics/lock-record.png differ
diff --git a/notes/pics/lock-states.png b/notes/pics/lock-states.png
new file mode 100644
index 00000000..b36faed0
Binary files /dev/null and b/notes/pics/lock-states.png differ
diff --git a/notes/pics/markword.png b/notes/pics/markword.png
new file mode 100644
index 00000000..5d1d7087
Binary files /dev/null and b/notes/pics/markword.png differ
diff --git a/tools/diagram/src/jc-atomic-cas.svg b/tools/diagram/src/jc-atomic-cas.svg
new file mode 100644
index 00000000..613e3683
--- /dev/null
+++ b/tools/diagram/src/jc-atomic-cas.svg
@@ -0,0 +1,63 @@
+
diff --git a/tools/diagram/src/jc-cnt-race.svg b/tools/diagram/src/jc-cnt-race.svg
new file mode 100644
index 00000000..70eec535
--- /dev/null
+++ b/tools/diagram/src/jc-cnt-race.svg
@@ -0,0 +1,64 @@
+
diff --git a/tools/diagram/src/jc-countdownlatch.svg b/tools/diagram/src/jc-countdownlatch.svg
new file mode 100644
index 00000000..14b67d35
--- /dev/null
+++ b/tools/diagram/src/jc-countdownlatch.svg
@@ -0,0 +1,68 @@
+
diff --git a/tools/diagram/src/jc-cpu-cache.svg b/tools/diagram/src/jc-cpu-cache.svg
new file mode 100644
index 00000000..3779c5a6
--- /dev/null
+++ b/tools/diagram/src/jc-cpu-cache.svg
@@ -0,0 +1,79 @@
+
diff --git a/tools/diagram/src/jc-cyclicbarrier.svg b/tools/diagram/src/jc-cyclicbarrier.svg
new file mode 100644
index 00000000..10804b06
--- /dev/null
+++ b/tools/diagram/src/jc-cyclicbarrier.svg
@@ -0,0 +1,68 @@
+
diff --git a/tools/diagram/src/jc-hb-join.svg b/tools/diagram/src/jc-hb-join.svg
new file mode 100644
index 00000000..9dd8f88f
--- /dev/null
+++ b/tools/diagram/src/jc-hb-join.svg
@@ -0,0 +1,50 @@
+
diff --git a/tools/diagram/src/jc-hb-monitor.svg b/tools/diagram/src/jc-hb-monitor.svg
new file mode 100644
index 00000000..a12e2139
--- /dev/null
+++ b/tools/diagram/src/jc-hb-monitor.svg
@@ -0,0 +1,51 @@
+
diff --git a/tools/diagram/src/jc-hb-program-order.svg b/tools/diagram/src/jc-hb-program-order.svg
new file mode 100644
index 00000000..df9922ec
--- /dev/null
+++ b/tools/diagram/src/jc-hb-program-order.svg
@@ -0,0 +1,45 @@
+
diff --git a/tools/diagram/src/jc-hb-start.svg b/tools/diagram/src/jc-hb-start.svg
new file mode 100644
index 00000000..a6f1bb94
--- /dev/null
+++ b/tools/diagram/src/jc-hb-start.svg
@@ -0,0 +1,47 @@
+
diff --git a/tools/diagram/src/jc-hb-volatile.svg b/tools/diagram/src/jc-hb-volatile.svg
new file mode 100644
index 00000000..652b537b
--- /dev/null
+++ b/tools/diagram/src/jc-hb-volatile.svg
@@ -0,0 +1,50 @@
+
diff --git a/tools/diagram/src/jc-jmm-ops.svg b/tools/diagram/src/jc-jmm-ops.svg
new file mode 100644
index 00000000..44076873
--- /dev/null
+++ b/tools/diagram/src/jc-jmm-ops.svg
@@ -0,0 +1,54 @@
+
diff --git a/tools/diagram/src/jc-jmm.svg b/tools/diagram/src/jc-jmm.svg
new file mode 100644
index 00000000..ca5cf4ae
--- /dev/null
+++ b/tools/diagram/src/jc-jmm.svg
@@ -0,0 +1,61 @@
+
diff --git a/tools/diagram/src/jc-threadlocal.svg b/tools/diagram/src/jc-threadlocal.svg
new file mode 100644
index 00000000..b1f3a572
--- /dev/null
+++ b/tools/diagram/src/jc-threadlocal.svg
@@ -0,0 +1,73 @@
+
diff --git a/tools/diagram/src/jc-work-stealing.svg b/tools/diagram/src/jc-work-stealing.svg
new file mode 100644
index 00000000..1bb217df
--- /dev/null
+++ b/tools/diagram/src/jc-work-stealing.svg
@@ -0,0 +1,53 @@
+
diff --git a/tools/diagram/src/lock-record.svg b/tools/diagram/src/lock-record.svg
new file mode 100644
index 00000000..b39e7377
--- /dev/null
+++ b/tools/diagram/src/lock-record.svg
@@ -0,0 +1,52 @@
+
diff --git a/tools/diagram/src/lock-states.svg b/tools/diagram/src/lock-states.svg
new file mode 100644
index 00000000..0fa4a66f
--- /dev/null
+++ b/tools/diagram/src/lock-states.svg
@@ -0,0 +1,59 @@
+
diff --git a/tools/diagram/src/markword.svg b/tools/diagram/src/markword.svg
new file mode 100644
index 00000000..e9e53f4e
--- /dev/null
+++ b/tools/diagram/src/markword.svg
@@ -0,0 +1,79 @@
+