gpt4 book ai didi

Java volatile 需要同步访问吗?

转载 作者:行者123 更新时间:2023-11-30 03:08:37 26 4
gpt4 key购买 nike

在下面的情况下, volatile 是多余的吗?删除 volatile 会有什么不同吗?或者,保留 volatile 但删除同步块(synchronized block)和同步修饰符会产生任何影响吗?

private volatile boolean registered;

synchronized boolean registered() {
return registered;
}

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

最佳答案

不,除非您拥有未显示的其他访问权限,registered没有 volatile 就可以了.

正在删除volatile我认为会稍微加快代码速度。但我认为删除 volatile 的主要好处它是否为维护者清理了代码。

在这种情况下,volatile 之间没有区别。以及我可以看到的同步方法,因此请使用其中之一。 (除了同步方法使您用来保护 registered 字段的对象公开,这可能是好是坏。私有(private) volatile 使同步锁保持私有(private)。)

<小时/>

为了尝试澄清最后一个陈述,如果您有这样的类(class):

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
}
}
}

还有其他人尝试访问 reg.registered()而锁定 Test被持有将阻塞,直到所述锁被释放。该锁对任何可以看到该对象的人都是公开的。这可能是好事,也可能是坏事。它允许其他类控制对您的方法的访问,这对于原子性很有好处,但它也可能会将一些线程控制烘焙到源库中,在源库中它会分布到各处,而不仅仅是由一个类封装。好和坏。可能还有其他例子可以说明为什么这可能是好是坏,这只是其中之一。

关于Java volatile 需要同步访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com