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可能已经执行过几次了,也可能没执行,所以造成输出顺序会不同