回覆列表
  • 1 # 使用者4443039916277

    只會執行一次

    復現:

    可以在Student類的構造函數里面加上 如:

    執行會發現它只會列印一次

    粗略原理:

    static 變數是類變數,會在該類第一次使用時進行初始化,並且只會初始化一次,類載入器內部會有鎖去控制避免一個類被初始化多次,靜態field和靜態程式碼塊 都是隻會執行一次,在編譯器的角度來說,編譯器在編譯時會按順序收集靜態field和靜態程式碼塊 然後放到一個生成的<cinit>特殊方法中,類初始化的時候會呼叫 <cinit>方法。

    應用:

    static變數只會載入一個的這個特性可以被應用在單例的實現中,如這裡(單例模式 | 菜鳥教程) 的單例的第三種實現方法,基於 classloader 機制避免了多執行緒的同步問題 。

    對於你的疑問:

    對於第三種情況, 當前執行緒等上一個執行緒初始化後, 再執行一次初始化? 那豈不是跟第四種情況衝突?

    等上一個執行緒初始化後,判斷一下有有沒成功初始化,直接拿結果就好

    對於第三種情況, 當前執行緒等上一個執行緒初始化後, 不會再初始化, 但是有可能拿到一個只有部分域初始化的不完全物件? 這裡的初始化 只是申請了一塊記憶體, 賦值了指標?

    你這個疑問有點意思,上一個執行緒初始化可以說是拿了鎖,然後執行了加鎖程式碼,當退出鎖時,加鎖程式碼的結果會完全同步,這是鎖的一個特性(好像叫記憶體可見性什麼的)。然後下一個現場拿到的結果就是正常的結果

  • 2 # 使用者6745035785625

    for迴圈中不應該再有A*了(只有定義的時候需要說明型別,之後用的時候直接用陣列名就可以了) 只用: recode[i] = NULL:就行了。

  • 中秋節和大豐收的關聯?
  • 球球大作戰瘋子那個huya兩個字怎麼打?