OCPJP考试中的多线程

Sid*_*iya 5 java multithreading

虽然我找到了答案,但我遇到了一个我很难理解的问题.请看这个并给我一个答案的解释.

public class TestSeven extends Thread {
  private static int x;
  public synchronized void doThings() {
    int current = x;
    current++;
    x = current;
  }
  public void run() {
    doThings();
  }
} 
Run Code Online (Sandbox Code Playgroud)

问题和答案是......哪种说法是正确的?

A.编译失败.

B.在运行时抛出异常.

C.同步run()方法会使类成为线程安全的.

D.变量"x"中的数据受到保护,不会出现并发访问问题.

E. 将doThings()方法声明为static将使类成为线程安全的.

F.在同步(new Object()){}块中包装doThings()中的语句将使该类成为线程安全的.

大胆的一个作为答案.感谢您的回复!

use*_*547 6

如果你有这样的同步实例方法,它会在实例上同步,即每个实例都可以自己访问该方法.但是x是静态的,因此任何实例都TestSeven可以同时访问它.如果doThings()是静态的,它会在类上同步,因此在给定时间只有一个实例可以访问同步代码.