线程ID非法值为什么输出的是负数

* 进来之后判断数量大于0之后 休眠10毫秒 卖出去同一张票是什么原因? * 1号 2号 线程进来判断票数大于0 卖7号票 可是1号线程买完之后还没来得及打印 2号也买了7号票 * 1.为什么会出现负数票 * (1)当票数等于1的时候 可能有2个线程判断完if语句但是 还在休眠 * (2)休眠结束后 继续执行卖票环节 * 3.出现这种问题该怎么办? * (1)休眠之后在继续执行判断

由于num是类静态变量,那么它会被存到堆中,在run()方法执行时拷贝一份副本到栈中存储,当有多个线程修改时,可能同时拿到一样的副本,但是由于执行的前后顺序,一个线程修改并写入了该变量,虽然堆中num已经发生变化,但是其他线程并不知道,它们会继续修改那份副本。然后修改后写入堆中,那这样就会覆盖之前线程的修改,进而导致状态的不一致问题。
那么如果才能确保线程安全性呢。那就要确保修改num之前保证对堆区修改的可见性,修改之前再拿一份副本(即使之前已经拿过了),这个可用volatile关键字来保证。

原子性,由于num--实际执行是两个操作,那么就会存在执行顺序问题。即使在前面说过用volatilel来保证可见性。但是还会存在修改被其他线程覆盖的情形,只不过几率变小了。怎样保证原子性呢,可以采用synchronized关键字,Lock机制,以及JDK并发工具包等。对于这种情形,最简单的办法就是

我要回帖

更多关于 线程ID 的文章

 

随机推荐