港岛爷爷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条)

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面