如何让Constructor theadsafe?
How to make the Constructor theadsafe?
我可以使 Class 的构造函数成为线程安全的吗?不允许使用关键字 synchronized?
我不想创建一个变量,我在其中保护对象的 "State" 并检查每个方法 ..
示例:
public class Main2 {
static TestClass object;
public static void main(String[] args) {
new Thread() {
public void run() {
object = new TestClass();
};
}.start();
new Thread() {
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
object.printValue();
}
}.start();
}
}
class TestClass {
private int value;
public TestClass() {
System.out.println("Start Constructor");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Finished Constructor");
this.value = 5;
}
public void printValue() {
System.out.println("Value: \"" + this.value + "\"");
}
}
输出:
Start Constructor
Exception in thread "Thread-1" java.lang.NullPointerException
at Main2.run(Main2.java:19)
Finished Constructor
有什么想法吗?
使用工厂模式。
将构造函数设为私有并添加 public 构造对象的静态同步方法。
这与对象内部的线程安全无关。对象在您访问之前未创建。
您正在访问一个空对象。一个简单的空检查就可以解决问题。
我可以使 Class 的构造函数成为线程安全的吗?不允许使用关键字 synchronized? 我不想创建一个变量,我在其中保护对象的 "State" 并检查每个方法 ..
示例:
public class Main2 {
static TestClass object;
public static void main(String[] args) {
new Thread() {
public void run() {
object = new TestClass();
};
}.start();
new Thread() {
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
object.printValue();
}
}.start();
}
}
class TestClass {
private int value;
public TestClass() {
System.out.println("Start Constructor");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Finished Constructor");
this.value = 5;
}
public void printValue() {
System.out.println("Value: \"" + this.value + "\"");
}
}
输出:
Start Constructor
Exception in thread "Thread-1" java.lang.NullPointerException
at Main2.run(Main2.java:19)
Finished Constructor
有什么想法吗?
使用工厂模式。
将构造函数设为私有并添加 public 构造对象的静态同步方法。
这与对象内部的线程安全无关。对象在您访问之前未创建。
您正在访问一个空对象。一个简单的空检查就可以解决问题。