为什么这个同步方法会给我一个错误?

时间:2015-01-20 22:06:49

标签: java

//What will happen when you attempt to compile and run the following code?

public class TestThread extends Thread {
    public static void main(String[] args) {
        new TestThread().start();
        new TestThread().start();
    }

    public void run() {
        Safe s1 = new Safe("abc");
        Safe s2 = new Safe("xyz");
    }
}

class Safe {
    String  str;

    public synchronized Safe(String s) {
        str = s;
        str = str.toUpperCase();
        System.out.print(str + " ");
    }
}

为什么这个方法公共同步安全(String S)给我一个编译错误?我知道我们无法同步变量,但上面的代码出了什么问题?!?!

3 个答案:

答案 0 :(得分:8)

此类构造函数无法同步:

public Safe(String s) 

synchronize构造函数没有意义,因为每次调用构造函数时,它都在处理一个单独的新对象。即使两个构造函数同时工作,它也不会发生冲突。

Section 8.8.3 of the JLS表示构造函数允许使用哪些修饰符,而synchronized不是其中之一:

  

ConstructorModifier:

     

注释公共保护私人

此外,它声明:

  

没有实际需要同步构造函数,因为它会锁定正在构造的对象,在对象的所有构造函数完成其工作之前,通常不会将其提供给其他线程。

没有必要,所以不允许。

答案 1 :(得分:2)

您的方法是构造函数,并且构造函数无法同步。

请参阅this question

答案 2 :(得分:1)

构造函数(据我所知)无法同步。因为当你调用构造函数时,它会在内存中创建一个新位置。这个新位置在创建之前不能同时尝试访问它,因此不需要同步构造函数。您的方法应该是:

public Safe(String s) {
    str = s;
    str = str.toUpperCase();
    System.out.print(str + " ");
}