Maison > Questions et réponses > le corps du texte
public static void main(Sting args[]){
Object a=null;
new Thread(){
a=new xxx()
}.start();
new Thread(){
a=new xxx()
}.start();
}
Je voudrais demander s'il existe une logique d'initialisation d'objet complexe dans la méthode xxx(). L'objet créé par le nouveau mot-clé est-il atomique ? Sinon, y aura-t-il un problème de trouble d’initialisation des objets ?
扔个三星炸死你2017-06-23 09:16:17
Je ne comprends pas ce que tu veux dire, si je suppose que c'est exact :
Tout dépend de la logique spécifique de votre méthode de construction. Après tout, le code est écrit par des humains.
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();
}
}
Sortie :
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
Autre exemple, le constructeur contient un bloc de synchronisation, et chaque thread doit attendre la fin de l'exécution du thread précédent avant de pouvoir s'exécuter.
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();
}
}
Sortie :
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
扔个三星炸死你2017-06-23 09:16:17
Non, par exemple, si plusieurs éléments de logique sont écrits dans la méthode de construction, ils peuvent être interrompus lors de l'exécution de la méthode de construction.
PHP中文网2017-06-23 09:16:17
La description de « atomicité » est trop abstraite. Lorsque l'affiche pose des questions, il vaut mieux ne pas penser que tout le monde a exactement la même compréhension d'un certain mot. Tout ce que je peux dire, c'est que le constructeur est thread-safe. Pour chaque objet, le constructeur ne sera exécuté qu'une seule fois et par un seul thread.