Question 129
Given:
1. public class TestSeven extends Thread {
2. private static int x;
3. public synchronized void doThings() {
4. int current = x;
5. current++;
6. x = current;
7. }
8. public void run() {
9. doThings();
10. }
1 1.}
Which is true?
A. Compilation fails.
B. An exception is thrown at runtime.
C. Synchronizing the run() method would make the class thread-safe.
D. The data in variable “x” are protected from concurrent access
problems.
E. Declaring the doThings() method as static would make the class
thread-safe.
F. Wrapping the statements within doThings() in a synchronized(new
Object()) { } block would make the class thread-safe.不会做,请分析一下

解决方案 »

  1.   

    public class TestSeven extends Thread {
        private static int x;    public synchronized void doThings() {
            int current = x;
            current++;
            x = current;
        }    public void run() {
            doThings();
        }    public static void main(String[] args){
            TestSeven s=new TestSeven();
            s.start();
        }

    我感觉doThings方法是线程安全的,run方法里只有一个doThings方法,那么run应该也是线程安全的。
      

  2.   

      答案是E,但它不是最好的
        public  void doThings() {
    try{
    Thread.sleep((int)(Math.random()*1000));
    }catch(InterruptedException ee){
    ee.printStackTrace();
    }
    synchronized(自定设置个静态对象){//这里加最好
    int current = x;
    current++;
    x = current;
    }
    System.out.println( Thread.currentThread()+""+ x);
    }
      

  3.   

    If one static method is synchronized, JVM will use the Class as the lock. If not, it acts as an instance method. 
    选E.