Heim > Fragen und Antworten > Hauptteil
public static void main(Sting args[]){
Object a=null;
new Thread(){
a=new xxx()
}.start();
new Thread(){
a=new xxx()
}.start();
}
Ich möchte fragen, ob die Methode xxx() eine komplexe Objektinitialisierungslogik enthält. Ist das Objekt durch das neue Schlüsselwort atomar? Wenn nicht, liegt dann das Problem einer Objektinitialisierungsstörung vor?
扔个三星炸死你2017-06-23 09:16:17
没明白你的意思,如果我猜得不错的话:
这完全取决于你的构造方法里面的具体的逻辑,毕竟代码是人写的。
public class Test {
static class A{
public A(){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:hh:mm:ss:SS");
System.out.println(sdf.format(new Date()) + "--begin --从线程" + Thread.currentThread().getName() + "中创建A");
Thread.sleep(2000);
System.out.println(sdf.format(new Date()) + "--end--从线程" + Thread.currentThread().getName() + "中创建A");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("A is " +new A());
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("A is " +new A());
}
}).start();
}
}
输出:
2017-06-16:11:46:43:780--begin --从线程Thread-1中创建A
2017-06-16:11:46:43:780--begin --从线程Thread-0中创建A
2017-06-16:11:46:45:786--end--从线程Thread-0中创建A
2017-06-16:11:46:45:786--end--从线程Thread-1中创建A
A is nwe.Test$A@1e6a629c
A is nwe.Test$A@27fcb25d
另一个例子,构造器中包含同步块,每一个线程都需要等待前面的线程执行完成后才能执行。
import java.text.*;
import java.util.Date;
public class Test {
static class A{
public A(){
try {
synchronized (Test.class) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:hh:mm:ss:SS");
System.out.println(sdf.format(new Date()) + "--begin --从线程" + Thread.currentThread().getName() + "中创建A");
Thread.sleep(2000);
System.out.println(sdf.format(new Date()) + "--end--从线程" + Thread.currentThread().getName() + "中创建A");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("A is " +new A());
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("A is " +new A());
}
}).start();
}
}
输出:
2017-06-16:11:49:33:548--begin --从线程Thread-0中创建A
2017-06-16:11:49:35:549--end--从线程Thread-0中创建A
A is nwe.Test$A@717c3e10
2017-06-16:11:49:35:550--begin --从线程Thread-1中创建A
2017-06-16:11:49:37:553--end--从线程Thread-1中创建A
A is nwe.Test$A@27280786
PHP中文网2017-06-23 09:16:17
“原子性”这种描述太抽象,楼主提问的时候最好不要认为所有人对某个词的认识都完全一样。我只能说构造方法是线程安全的,对于每一个对象,构造方法只会被执行一次,只会被一个线程执行。