轉載文 各種各樣的鎖 :https://www.cnblogs.com/hustzzl/p/9343797.html
併發推薦書籍:https://blog.csdn.net/notonlyrush/article/details/80401618
鎖的一些底層視頻:https://www.bilibili.com/video/av65172968
=======================
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.8</version>
</dependency>
引入上面的包,可以用於線程查看class文件的頭部信息,使用方式如下
public static void main(String[] args) {
Object obj = new Object();
synchronized (obj) {
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
}
}
不加鎖:
爲什麼都是0,沒有hashCode?因爲hashCode是算法算出來的值,沒有經過計算當然沒有值,例如obj.hashCode()計算後會有hashCode。因此是否有兩個對象的hashCode存在一樣的?是的,沒有經過計算的hashCode值是一樣的。
經過hashCode計算:
加鎖:
class組成:java的對象頭,java對象的實例數據,對齊數據
java對象大小必須是8的整數倍(1byte = 8bit,即一個字節8位),因此最後補齊4個bit。
對象頭由兩部分組成:Mark Word(64bit),Klass Pointer/Class Metadata Address(32bit,默認JVM啓動指針壓縮,因此頭部只佔用了96bit,若非指針壓縮此內容佔64bit)。存儲:類型,GC狀態,同步狀態(偏向鎖/輕量鎖/重量鎖)和哈希碼
LockSupport.park();;
LockSupport.unpark(thread1);
可以用於鎖,也可以不用於鎖的暫停和喚醒
juc:rt.jar:java.util.concurrent