JAVA中多线程读取成员变量的重复问题

这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?... 这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗?
代码:

输出:
展开
 我来答
LMLU23
2014-07-15 · TA获得超过901个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:365万
展开全部
这很正常啊
SystemOut和num--不是原子操作啊。在某一时刻,num=8,线程1SystemOut:8,然后被中断,执行线程2,也是SystemOut:8,然后又被中断执行线程3,再线程4,这时候4个线程都输出了8,最后回到线程1执行num--。
即使是一条语句,也不能保证是原子操作,除非调用的对象说明是线程安全的,或者使用锁、队列,否则都不能保证并发的安全。
米多多MiDD
2014-07-15 · TA获得超过1077个赞
知道小有建树答主
回答量:562
采纳率:66%
帮助的人:229万
展开全部
1.使用 num常量时 请同步 synchronized

2.或者整个逻辑建议使用 java.util.concurrent.ExecutorService
追问
谢谢
追答
代码结果都错了  楼下还特么的跟我说【synchronized 关键字效率很低,注意不要乱用】你不用试试看能解决问题不
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
山雨城
2014-07-15 · TA获得超过114个赞
知道小有建树答主
回答量:131
采纳率:0%
帮助的人:77.2万
展开全部
用java的synchronized 关键字可以避免这个问题,为什么输出了四次,其实这个次数不固定,只是说有别的线程和本线程同事读取了一个变量而已,而且在读取过程中其他线程还没有来得及修改这个变量,

这本质就是对线程的问题,synchronized 关键字效率很低,注意不要乱用
追问
谢谢
追答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
呼哈嘿吼呵Cf
2014-07-15 · TA获得超过210个赞
知道小有建树答主
回答量:335
采纳率:0%
帮助的人:207万
展开全部
卖出同样的票和你出现负数,是一个情况,都是因为没有锁
追问
谢谢,这个我知道
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式