假设:
public class TestSeven extends Thread {
private static int x;
public synchronized void doThings() {
int current = x;
current++;
x = current;
}
public void run() {
doThings();
}
}
哪个陈述是正确的?
A. 编译失败。
B. 运行时会抛出异常。
C. 对run()方法进行同步会使类线程安全。
D. 变量"x"中的数据受到并发访问问题的保护。
E. 将doThings()方法声明为静态将使该类线程安全。
F. 在synchronized(new Object()) { }块中包装doThings()语句将使该类线程安全。
仅将doThings()标记为同步,是否足以使该类线程安全?我看到正确答案是D,但是这个问题的模型答案是E,但我不理解为什么?
D
是不正确的。想象两个实例在两个独立的线程上并行运行,testSevenA
和testSevenB
。当testSevenA
进入run
时,它将同步自己,然后开始工作。当testSevenB
进入run
时,它将同步自己,然后开始工作。在任何情况下,一个实例都没有受到另一个实例的保护。如果将该方法设置为static
,如E
所说,那么两个实例都将针对TestSeven.class
进行同步,从而限制了run
只能被一个Thread
访问,因此保护了static
变量。 - pickypgE
的一部分。它说要将其声明为static
,而不是将其声明为static
并取消声明为synchronized
。换句话说,应该声明为public static synchronized void doThings()
。 - pickypg