【发布时间】:2014-11-25 07:26:05
【问题描述】:
假设我有一个全局对象:
class Global {
public static int remoteNumber = 0;
}
有一个线程定期运行以从远程获取新号码,并更新它(仅写入):
new Thread {
@override
public void run() {
while(true) {
int newNumber = getFromRemote();
Global.remoteNumber = newNumber;
Thread.sleep(1000);
}
}
}
并且有一个或多个线程随机使用这个全局remoteNumber(只读):
int n = Global.remoteNumber;
doSomethingWith(n);
您可以看到我没有使用任何锁或synchronize 来保护它,对吗?是否有任何可能导致问题的潜在问题?
更新:
就我而言,读取线程必须实时获取最新的新值并不重要。我的意思是,如果有任何问题(由于缺少锁定/同步)使一个读取线程错过了该值,那没关系,因为它很快就会有机会运行相同的代码(可能在循环中)
但不允许读取未确定的值(我的意思是,如果旧值为 20,则新更新值为 30,但读取线程读取不存在的值例如 33,我不确定是否可能)
【问题讨论】:
-
是的,一个线程写入多个线程读取正是需要同步的情况。
-
对于那个用例,你会遇到可见性问题:阅读线程可能看不到全局数字的新值。您至少需要使其 volatile 或更好,才能使用 AtomicInteger。
-
阅读线程可能永远看到新值。为什么要使用不正确的代码而不是正确的代码,尤其是当您只需要使用 AtomicInteger 或 volatile int 来使其正确时?你真的认为这会导致任何性能问题吗?不会的。
-
@JBNizet,谢谢,我只是不明白为什么我们应该使用这些保护措施,而不仅仅是盲目地复制这些模式。但是感谢您的出色回答,现在我变得更加清晰了
标签: java multithreading locking synchronized