港岛爷爷zx 2018-06-01 10:54 采纳率: 100%
浏览 688
已采纳

java Runable一个现象的解释,理解不了

main方法

 public class main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Ticket ti=new Ticket();
Thread t1=new Thread(ti);
Thread t2=new Thread(ti);
Thread t3=new Thread(ti);
Thread t4=new Thread(ti);
t1.start();
t2.start();
t3.start();
t4.start();
}
}

runable实现类

 public class Ticket implements Runnable {
    private int all=100;
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            if(all>0)
            {
                System.out.println(Thread.currentThread().getName()+"ticket"+all);
                all--;
            }

            else
                break;
        }
    }

}

输出结果
Thread-0ticket100
Thread-0ticket99
Thread-0ticket98
Thread-2ticket100
Thread-2ticket96
Thread-2ticket95
Thread-2ticket94
Thread-2ticket93
Thread-2ticket92
Thread-2ticket91
Thread-2ticket90
Thread-2ticket89
Thread-2ticket88
Thread-2ticket87
Thread-2ticket86
Thread-2ticket85
Thread-2ticket84
Thread-2ticket83
Thread-2ticket82
Thread-2ticket81
Thread-2ticket80
Thread-2ticket79
Thread-2ticket78
Thread-2ticket77
Thread-2ticket76
Thread-2ticket75
Thread-2ticket74
Thread-3ticket100
Thread-3ticket72
Thread-3ticket71
Thread-1ticket100
Thread-3ticket70
Thread-2ticket73
Thread-2ticket67
Thread-2ticket66
Thread-2ticket65
Thread-2ticket64
Thread-2ticket63
Thread-2ticket62
Thread-2ticket61
Thread-2ticket60
Thread-2ticket59
Thread-2ticket58
Thread-2ticket57
Thread-0ticket97
Thread-2ticket56
Thread-3ticket68
Thread-3ticket53
Thread-3ticket52
Thread-1ticket69
Thread-3ticket51
Thread-2ticket54
Thread-0ticket55
Thread-2ticket48
Thread-3ticket49
Thread-1ticket50
Thread-3ticket45
Thread-2ticket46
Thread-0ticket47
Thread-2ticket42
Thread-2ticket40
Thread-2ticket39
Thread-2ticket38
Thread-2ticket37
Thread-2ticket36
Thread-2ticket35
Thread-2ticket34
Thread-3ticket43
Thread-1ticket44
Thread-3ticket32
Thread-2ticket33
Thread-0ticket41
Thread-2ticket29
Thread-3ticket30
Thread-1ticket31
Thread-3ticket26
Thread-3ticket24
Thread-3ticket23
Thread-3ticket22
Thread-3ticket21
Thread-3ticket20
Thread-2ticket27
Thread-2ticket18
Thread-2ticket17
Thread-2ticket16
Thread-2ticket15
Thread-2ticket14
Thread-2ticket13
Thread-2ticket12
Thread-2ticket11
Thread-2ticket10
Thread-2ticket9
Thread-2ticket8
Thread-2ticket7
Thread-2ticket6
Thread-2ticket5
Thread-2ticket4
Thread-2ticket3
Thread-2ticket2
Thread-2ticket1
Thread-0ticket28
Thread-3ticket19
Thread-1ticket25
为什么100出现了4次,非首次输出的其他输出100的时候,顶替掉了原来的数值,却在结尾输出。不是公用一个ticket的吗,为什么后面还会出现100.。。

  • 写回答

10条回答 默认 最新

  • 风格的时光机 2018-06-01 13:47
    关注

    线程在工作时,会先从主内存中读取数据,再把all的值从主内存中拷贝一份到自己的线程内存中,然后在运行一段时间后往主内存中写入已经改变的all的值,由于线程运行是抢占式的,t1线程还没来得及通知主线程中all的值已经改变了,t2线程就已经从主内存中又拷贝了一份all的变量,所以就变成这种状况了,我个人理解的,说的不对的地方请见谅。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题