jvm - Les nouveaux objets Java sont-ils atomiques?
滿天的星座
滿天的星座 2017-06-23 09:14:17
0
4
1172
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 ?

滿天的星座
滿天的星座

répondre à tous (4)
扔个三星炸死你

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
    淡淡烟草味

    Il est recommandé de se référer au mode singleton thread-safe

      扔个三星炸死你

      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.

        洪涛

        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.

          Derniers téléchargements
          Plus>
          effets Web
          Code source du site Web
          Matériel du site Web
          Modèle frontal
          À propos de nous Clause de non-responsabilité Sitemap
          Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!