簡體   English   中英

Java volatile是否需要同步訪問?

[英]Java volatile necessary with synchronized access?

在以下情況下, volatile冗余嗎? 在這里去除volatile有所作為嗎? 另外,在這里留下volatile但刪除同步塊和同步修飾符會有所不同嗎?

private volatile boolean registered;

synchronized boolean registered() {
  return registered;
}

void setRegistered(boolean registered) {
  synchronized (this) {
    this.registered = registered;
  }
}

不可以,除非您具有未顯示的其他訪問權限,否則無需volatile即可進行registered

我認為,刪除volatile將稍微加快代碼的速度。 但是我認為除去volatile的主要好處是可以為維護人員清理代碼。

在這種情況下,我可以看到volatile方法和同步方法之間沒有區別,因此請使用其中一種。 (除了同步方法使您用來保護registered字段的對象公開 (可能是好是壞), public volatile使同步鎖保持私有。)


要嘗試澄清最后一條語句,如果您有這樣的類:

public class Reg {
    private boolean registered;

    synchronized boolean registered() {
      return registered;
    }

    void setRegistered(boolean registered) {
      synchronized (this) {
        this.registered = registered;
      }
    }
}

然后,您將為其創建以下新實例:

public class Test {
  public static Reg reg;
  public void static main( String... args ) {
     reg = new Reg();
     synchronized( reg ) {
            // do stuff
     }
  }
}

持有Test該鎖時嘗試訪問reg.registered()任何其他人都將阻塞,直到釋放該鎖為止。 鎖對任何可以看到該對象的人都是公開的。 這可能是好事,也可能是壞事。 它可以讓其他類控制對您方法的訪問,這可能對原子性有好處,但是它也可能將一些線程控制烘焙到源代碼庫中,在該庫中,線程控制得到了擴展,而不僅僅是被一個類封裝。 好和壞。 可能還有其他例子說明為什么這可能是好是壞,這僅僅是一個例子。

暫無
暫無

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

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