多線程高併發筆記五

轉載文 各種各樣的鎖 :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

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章