请教java多线程问题

小太阳很温暖 2020-02-06 10:56:02
我想请问。我明明只循环20遍,-1和-2哪来的?
...全文
655 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
不烦人的阙 2021-03-10
  • 打赏
  • 举报
回复
要么让循环同步要么让方法同步
  • 打赏
  • 举报
回复
简单一些:将while(ticket)改为while(true),在同步代码块中加判断。
冰思雨 2021-03-04
  • 打赏
  • 举报
回复
while 条件中的 tick 变量,不在临界区内,所以,程序执行到 while 条件时,不受临界区的保护,从而产生线程安全问题。 楼主可以尝试,在声明 tick 的时候,使用 volatile 关键字,它可以保证,多线程的场景下,读取 tick 变量的值是一致的。当然,写入的时候,还是要上锁的。 不推荐使用 AtomicInteger 变量,因为,用法不太合适。
啥都无所谓 2021-02-03
  • 打赏
  • 举报
回复
引用 2 楼 披着虎皮_的石头 的回复:
楼主把名字,改为 对我来说,你是光,更好一些。
楼主把名字,改为“ 好家伙!看见你我直接迪迦” 更好一些。
Francis.Sun 2021-02-03
  • 打赏
  • 举报
回复
改成AtomicInteger锁都不用加的。。。。
Francis.Sun 2021-02-03
  • 打赏
  • 举报
回复
把tick的int改为AtomicInteger就可以了。
Java全栈路线 2021-02-03
  • 打赏
  • 举报
回复
tick = 1的时候三个线程同时进入 while 循环中,然后一个线程拿到锁,另外两个在等待,这时就会有 -1 -2出现
Dylan、 2021-02-03
  • 打赏
  • 举报
回复
线程没有锁,可以在ticket = 1的时候有三个线程有执行权,这样,就算一个线程被终止了,另外的三个线程还会--,-2只是一种可能,你可以多运行几次找找规律 还有,可以用ReentrantLock锁一下线程,也可以用synchronized锁一下就OK了
  • 打赏
  • 举报
回复
楼主把名字,改为 对我来说,你是光,更好一些。
TimGaGa 2021-02-02
  • 打赏
  • 举报
回复
把while也锁进去就好了,其实你这样整个方法全在锁里的,可以试着把方法锁上
maradona1984 2021-02-02
  • 打赏
  • 举报
回复
楼主可以去了解下 "双重检测锁"
源者鬼道 2021-02-02
  • 打赏
  • 举报
回复
刚看到楼主有一个19年的找工作的帖子,就有看到了最新的学习帖子,想问一下楼主,开发的工作之前找的怎么样,想了解一下,我之后也想去培训,然后转行找工作
musdenis 2020-02-07
  • 打赏
  • 举报
回复
因为你的while语句并没有锁,所以在判断while(tick>0)时会有问题,比方说tick=1的时候,三个线程都满足条件的,所以你需要在同步代码块中再判断一下tick是否大于0

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧