//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)给我一个编译错误?我知道我们无法同步变量,但上面的代码出了什么问题?!?!
答案 0 :(得分:8)
此类构造函数无法同步:
public Safe(String s)
synchronize
构造函数没有意义,因为每次调用构造函数时,它都在处理一个单独的新对象。即使两个构造函数同时工作,它也不会发生冲突。
Section 8.8.3 of the JLS表示构造函数允许使用哪些修饰符,而synchronized
不是其中之一:
ConstructorModifier:
注释公共保护私人
此外,它声明:
没有实际需要同步构造函数,因为它会锁定正在构造的对象,在对象的所有构造函数完成其工作之前,通常不会将其提供给其他线程。
没有必要,所以不允许。
答案 1 :(得分:2)
您的方法是构造函数,并且构造函数无法同步。
答案 2 :(得分:1)
构造函数(据我所知)无法同步。因为当你调用构造函数时,它会在内存中创建一个新位置。这个新位置在创建之前不能同时尝试访问它,因此不需要同步构造函数。您的方法应该是:
public Safe(String s) {
str = s;
str = str.toUpperCase();
System.out.print(str + " ");
}