请教一下,是什么原因导致list会不稳定打印?

public class ShareMemoryDemo {
    //静态资源
    private static int shared=0;
    public static void incrShared(){
        shared ++;
    }

    //创建线静态内部类
    static class ChildThread extends Thread{
     List<String> list;
     public ChildThread(List<String> list) {
            this.list = list;
     }
        @Override
        public void run() {
            incrShared();
            list.add(Thread.currentThread().getName());
        }
      //main方法
      public static void main(String[] args) throws InterruptedException {
          List<String> list=new ArrayList<>();
          Thread t1=new ChildThread(list);
          t1.setName("1号");
          Thread t2=new ChildThread(list);
          t2.setName("2号");
          t1.start();
          t2.start();
          t1.join();
          t2.join();
          System.out.println(shared);
          System.out.println(list);

      }
    }

}

 

打印结果(多次测试得不同结果):

2
[null, 1号];

2
[1号, 2号];

2
[null, 2号];

 

因为多线程同时访问一个list,会出现线程不安全的情况,数据会被不同的线程修改成不同的值,不会按照你想的顺序执行,你可以方法 加个  synchronized

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

ti.join要在t2.start前面,才会按照你要的顺序打印

join方法是暂停所有其他线程,等待调用join的线程执行完毕

你代码中有三个线程    主线程   t1 t2 ,

t2.start之后,这时三个线程是同时运行的,所以在主线程执行t1.join时,t2可能已经执行过几次了,也可能没执行,所以造成输出顺序会不同