簡體   English   中英

內部Java同步靜態方法:在靜態變量的關系之前發生

[英]Inside Java synchronized static method: happens before relationship for static variable

在同步類方法中對靜態變量的更新是否保證在之前發生? 以此為例:

public class MyClass {
    private static boolean isDone = false;

    public static synchronized doSomething() {
        if (!isDone) {
            // ...
        }

        isDone = true;
    } 
}

在此同步類方法中更新后,是否所有線程都可以看到變量isDone (沒有volatile )? 根據我的理解, MyClass.class同步本身並不能保證其靜態變量的所有更新都對其他線程可見,因為其他線程可能有一個本地緩存。

發生 - 之前是兩個事件之間的關系。 您指出的事件之一:“更新到同步類方法中的靜態變量”。 你有什么其他事件? 普通讀取另一個線程中的變量? 不,在另一個線程中的普通閱讀不參與發生在之前的關系。

也就是說,您是正確的建議同步不保證所有變量更新對其他線程可見。

UPDT為了保證變量的所有更新對其他線程可見,該線程還必須同步它們的讀取,即在同步類方法中進行讀取。

我在這里找到答案: https//www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#synchronization

在我們退出synchronized塊之后,我們釋放了監視器,它具有將緩存刷新到主內存的效果,因此該線程所做的寫操作對其他線程是可見的。 在我們進入同步塊之前,我們獲取監視器,它具有使本地處理器高速緩存無效的效果,以便從主存儲器重新加載變量。 然后,我們將能夠看到前一版本中顯示的所有寫入。

如果您遵循良好的編碼實踐,這是一種更簡單的思考方式:

如果它是synchronized你不必擔心它。

這是因為,如果線程A更新了任何變量然后釋放了一個鎖,那么在線程B鎖定相同的鎖之后,線程B將看到更新, 如果你遵循良好的編碼習慣,那么你的synchronized塊將盡可能小:您不會觸及同步塊內不需要同步的任何共享變量。 而且, 如果您遵循良好的編碼習慣,那么對變量(寫入或讀取 )的每次訪問都將被同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM