![](/img/trans.png)
[英]Effect of java synchronized monitor enter on non synchronized access or not volatile variables
[英]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.