Java类Thread Safe方法,用于考试认证1Z0-851

时间:2013-02-25 18:10:42

标签: java multithreading thread-safety

我正在研究1Z0-851 Oracla Java SE 1.6认证,我看到了这个问题:

question 4

有人能解释一下这个答案吗?

当我这么想的时候说我是否正确: 如果doThings()是静态的,则只有一个方法不是static时,每个TestSeven对象访问doThings同时修改x值不一致时,只能进行一次访问。 / p>

我这样思考是否正确?

感谢。

3 个答案:

答案 0 :(得分:4)

是的,是的。目前,如果您创建两个TestSeven实例并从2个不同的线程调用其doThings方法,则无法保证x将递增两次。例如,以下执行是合法的(T1和T2是两个线程):

T1: current = x //0
T2: current = x //0
T1: current++; // 1
T2: current++; // 1
T1: x = current; // 1
T2: x = current; // 1

所以你已经调用了两次方法,但x只增加了一次。

如果将方法设为静态,即使您创建了许多实例,也只有一个线程能够在给定时刻执行它。

答案 1 :(得分:2)

它不是线程安全的,因为 x 范围是“静态的”,即所有类实例都可以访问它,而 doThings 方法则不是。所以它只在类实例上同步。

因此,尽管有synchronized关键字,但在同一时间内可以有两个类实例访问 x

使方法保持静态将确保一次只调用一次。

答案 2 :(得分:2)

doThings()方法是一个实例方法,正在读取和写入静态变量x。通过使doThings()静态,它将在所有实例之间同步(类上的内部锁,而不是实例)。换句话说,就目前而言,该方法可以由多个线程同时调用,而使其静态可以防止这种情况。