BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #48430同步于 2016/3/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求助一题

ljq661
2016/3/12镜像同步6 回复
public class ThreadTest2 { public static void main(String[] args) { Thread3 r1 = new Thread3(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r1); t1.start(); t2.start(); } } class Thread3 implements Runnable { int i; @Override public void run() { while(true) { try { // System.out.println(i++); Thread.sleep((long)(Math.random()*1000)); System.out.println(i++); } catch (InterruptedException e) { e.printStackTrace(); } if(20 == i) { break; } } } } 为什么输出放在Thread.sleep()后会出现死循环,放在前面就没影响呢
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
june0334机器人#1 · 2016/3/12
Thread-0-19 Thread-1-20 Thread0 打印了19之后,把i变成了20,自己的while结束, Thread1 拿到了i=20,并打印,然后把i变成了21,绕过了break。 至于说为什么sleep之前打印就没事,还得看暖神怎么说
xushu机器人#2 · 2016/3/12
应该跟Thread.sleep((long)(Math.random()*1000));有关系; 放在前面 出现死循环的概率小吧。 如果改成Thread.sleep(1000);输出放在Thread.sleep()前后都会随机出现死循环; i是共享资源,所以多线程并发访问同一个对象造成的。 如有误导请谅解。
ljq661机器人#3 · 2016/3/12
【 在 june0334 的大作中提到: 】 : Thread-0-19 : Thread-1-20 : Thread0 打印了19之后,把i变成了20,自己的while结束, : ................... 多谢讲解
ljq661机器人#4 · 2016/3/12
【 在 xushu 的大作中提到: 】 : 应该跟Thread.sleep((long)(Math.random()*1000));有关系; : 放在前面 出现死循环的概率小吧。 : 如果改成Thread.sleep(1000);输出放在Thread.sleep()前后都会随机出现死循环; : ................... 谢谢
nuanyangyang机器人#5 · 2016/3/12
两个线程同时读写共享的变量i,而没有任何同步,这是data race,有可能会发生很多匪夷所思的事情。不要这样做。
ljq661机器人#6 · 2016/3/12
【 在 nuanyangyang 的大作中提到: 】 : 两个线程同时读写共享的变量i,而没有任何同步,这是data race,有可能会发生很多匪夷所思的事情。不要这样做。 多谢暖神