suchen

Heim  >  Fragen und Antworten  >  Hauptteil

jvm - Sind neue Java-Objekte atomar?

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?

滿天的星座滿天的星座2716 Tage vor1269

Antworte allen(4)Ich werde antworten

  • 扔个三星炸死你

    扔个三星炸死你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
    

    Antwort
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-23 09:16:17

    建议参考线程安全的单例模式

    Antwort
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-23 09:16:17

    不具有,比如构造方法中写了多条逻辑,在执行构造方法时,是可以中断的。

    Antwort
    0
  • PHP中文网

    PHP中文网2017-06-23 09:16:17

    “原子性”这种描述太抽象,楼主提问的时候最好不要认为所有人对某个词的认识都完全一样。我只能说构造方法是线程安全的,对于每一个对象,构造方法只会被执行一次,只会被一个线程执行。

    Antwort
    0
  • StornierenAntwort