【发布时间】:2014-07-18 18:34:33
【问题描述】:
我在这里寻找一些输入。我有一个单例类,其中包含一个值,该值由该类中的方法每隔几秒更新一次。现在,跨多个线程访问这个值是通过同步完成的,我想消除它。这有意义吗?
class DataSegment {
private MetricsUpdater metrics = new MetricsUpdater.getInstance();
public String printValues() {
StringBuilder sb = new StringBuilder();
sb.append(value1);
sb.append(morevalues);
sb.append(metrics.myValue); // this is the value that's currently synchronized
return sb.toString();
}
}
class MetricsUpdater {
private String myValueSynchronized;
public String myValue;
public static MetricsUpdater getInstance() {
if (theInstance == null) {
theInstance = new MetricsUpdater();
}
return theInstance;
}
// this runs on a timer but to keep it simple I'll just define the method...
private void updateMetrics() {
synchronized(myValue) {
// also, to keep things simple, I've replaced all of the actual logic with a method called someMethodToUpdateMyValue()
myValueSynchronized = someMethodToUpdateMyValue();
myValue = myValueSynchronized;
}
}
}
可能有许多 DataSegment 实例都从 myValue 中读取,但指标类是单例的。 myValue 仅每 5 秒左右更新一次,并且仅允许 MetricsUpdater 对其进行写入。这有意义吗?
如果只允许所有其他线程读取它,它甚至需要同步吗?我已经为此运行了大量的 JUnit 测试,创建了许多 DataSegment 类的实例,所有的打印值都像疯了一样,我还没有看到任何并发问题。
【问题讨论】:
-
一定会喜欢一个绝对没有反馈的反对票。
-
用户不需要证明他们的行为是正当的。但是,我同意这不应该仅仅因为你正在尝试一些不起作用的东西而被否决。我会投票支持它。
-
同意,但我正在寻找的只是反馈。没有信息的反对票不是任何有用的反馈。不过谢谢,我很感激。
标签: java multithreading synchronization