溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

談?wù)剬?duì)java的理解

發(fā)布時(shí)間:2020-06-28 03:21:28 來(lái)源:網(wǎng)絡(luò) 閱讀:592 作者:夢(mèng)Scarlett 欄目:軟件技術(shù)

1、java一次編譯,到處執(zhí)行----跨平臺(tái)

2、gc

3、jre和jdk 區(qū)別:

    jre(java runtime environment)java運(yùn)行環(huán)境,包含jvm的client,類庫(kù)(rt.jar:常用的集合、io、math、lang等都在rt.jar包內(nèi))

    jdk(java development kit)java開(kāi)發(fā)工具,包含jre(含jvm的client和server)及編譯器(javac)、診斷工具(jconsole.exe等)

4、java基礎(chǔ)類庫(kù):(java開(kāi)頭)

    java.lang(exception/string/stringbuffer/Integer等封裝類/math/annotion)

    java.util(concurrent/regex正則表達(dá)式/collection/日期date calendar)

參考 https://blog.csdn.net/basycia/article/details/50769838

5、java常用第三方類庫(kù):(javax開(kāi)頭)

    javax.swing、javax.naming

6、cas原理

java.util.concurrent包下的類都使用的是cas原理實(shí)現(xiàn)并發(fā),例如 automicInteger、concurrentHashMap

主存A,線程緩存數(shù)據(jù)B,更新值C,只有當(dāng)B=A時(shí),才會(huì)將    C賦值給A。

7、并發(fā)特性,可用syn、lock方式實(shí)現(xiàn)

原子性

有序性:jvm執(zhí)行java代碼時(shí)在保證不影響運(yùn)行結(jié)果情況下會(huì)進(jìn)行指令重排,有序性是避免指令重排。

內(nèi)存可見(jiàn)

8、volatile關(guān)鍵字

可保證內(nèi)存可見(jiàn):線程A修改后立即將數(shù)據(jù)寫(xiě)入主內(nèi)存。

有序性:修飾的關(guān)鍵字不被指令重排。保證在執(zhí)行關(guān)鍵字相關(guān)操作時(shí),之前的代碼已經(jīng)執(zhí)行,之后的代碼還未執(zhí)行,但不能保證關(guān)鍵字之前和之后代碼的順序性。

不能保證原子性。

volatile一個(gè)典型的應(yīng)用場(chǎng)景是 單例模式

class Singleton{
    private volatile static Singleton instance = null;
 
    private Singleton() {
 
    }
 
    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

為什么單例模式需要使用volatile修飾?

主要在于instance = new Singleton()這句,這并非是一個(gè)原子操作,事實(shí)上在 JVM 中這句話大概做了下面 3 件事情:

1.給 instance 分配內(nèi)存

2.調(diào)用 Singleton 的構(gòu)造函數(shù)來(lái)初始化成員變量

3.將instance對(duì)象指向分配的內(nèi)存空間(執(zhí)行完這步 instance 就為非 null 了)。

但是在 JVM 的即時(shí)編譯器中存在指令重排序的優(yōu)化。也就是說(shuō)上面的第二步和第三步的順序是不能保證的,最終的執(zhí)行順序可能是 1-2-3 也可能是 1-3-2。如果是后者,則在 3 執(zhí)行完畢、2 未執(zhí)行之前,被線程二搶占了,這時(shí) instance 已經(jīng)是非 null 了(但卻沒(méi)有初始化),所以線程二會(huì)直接返回 instance,然后使用,然后順理成章地報(bào)錯(cuò)。

參考: 

你真的了解volatile關(guān)鍵字嗎?

深入淺出CAS




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI