我正在研究1Z0-851 Oracla Java SE 1.6认证,我看到了这个问题:
有人能解释一下这个答案吗?
当我这么想的时候说我是否正确:
如果doThings()
是静态的,则只有一个方法不是static
时,每个TestSeven
对象访问doThings同时修改x值不一致时,只能进行一次访问。 / p>
我这样思考是否正确?
感谢。
答案 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()
静态,它将在所有实例之间同步(类上的内部锁,而不是实例)。换句话说,就目前而言,该方法可以由多个线程同时调用,而使其静态可以防止这种情况。