类中有一个变量,它被多个线程主动使用。例如:
public class A {
private int magicVar;
private void someMethod() {
// some operations with magicVar
}
public synchronized void somePublicMethod() {
// some operations with magicVar
}
private class B extends Thread {
@Override
private void run() {
// some operations with magicVar
}
}
}
在这种情况下如何组织对变量的访问?描述私有同步setter和getter?或者将此字段标记为违反?
答案 0 :(得分:1)
这完全取决于你打算如何使用你的课程。同步不是实现细节,它是设计的一部分。
在保护对整数的访问时,请考虑使用AtomicInteger
。
答案 1 :(得分:0)
使字段变为volatile将确保线程的可见性,但是如果您正在进行
之类的操作a = a + 2;
这是一个复合操作,而不是原子操作。要使所有线程都可以看到对您的字段的最新更改并执行原子操作,您可以将someMethod()和somePublicMetod()标记为同步。
要么具有锁定对象的更精细的同步块
Object lock = new Object(); // make this an instance variable
// ...
// then each time you need to make operations with your contended field you can do
synchronized(lock) {
// make changes to your contended field
}