虽然我找到了答案,但我遇到了一个我很难理解的问题。请看这个,给我一个关于答案的解释。
public class TestSeven extends Thread {
private static int x;
public synchronized void doThings() {
int current = x;
current++;
x = current;
}
public void run() {
doThings();
}
} 问题和答案是..。哪种说法是正确的?
A.汇编失败。
在运行时抛出异常。
同步run()方法将使类线程安全。
变量"x“中的数据不受并发访问问题的保护。
E. 将doThings()方法声明为静态将使类线程安全.
将语句包装在doThings()中的同步(新对象()){}块中将使类线程安全。
答案是大胆的。谢谢您的回复!
发布于 2016-04-04 06:41:35
如果有这样的同步实例方法,它就会在实例上同步,也就是说,每个实例都可以自己访问该方法。但是x是静态的,所以任何TestSeven实例都可以并发访问它。如果doThings()是静态的,它会在类上同步,因此只有一个实例可以在给定时间访问同步代码。
发布于 2016-04-04 06:43:02
下面是将要发生的事情。
public static syncronized void doThings();这将在类级别同步方法。这意味着只有一个类实例能够在一个时间实例中访问代码,这意味着其他实例不可能修改静态变量x。
在其他情况下,
public syncronized void doThings();这意味着doThings();方法在当前对象上是同步的。即TestSeven的一个实例,因此多个实例可以访问该方法,而该方法又可以更改不需要的静态共享变量x。
发布于 2016-04-04 06:43:32
使方法静态将使其在类级别上可用,而不是在实例级别上可用,因此方法行为对于该类的所有对象/实例都是相同的,就像一个静态变量一样。因此,类将变得线程安全,因为方法行为不是特定于实例的。
https://stackoverflow.com/questions/36395956
复制相似问题