A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

saralihuan1992

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© saralihuan1992 初级黑马   /  2015-3-11 12:27  /  729 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程安全这一直不是很明白,什么情况下会出现线程安全的问题呢?有哪些解决方案呢?最好的解决方案是什么?在此请教各位:)

6 个回复

倒序浏览
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,就可能导致共享数据的错误。
回复 使用道具 举报
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素1存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B向此 ArrayList 添加元素2,因为此时 Size 仍然等于
回复 使用道具 举报
健健 发表于 2015-3-11 12:44
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与 ...

好的,谢谢
回复 使用道具 举报
健健 发表于 2015-3-11 12:44
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与 ...

那我可以理解成:当线程要操作的数据是多个线程共享的数据时,并且有多条语句对该共享数据进行了操作,而其中一个线程对这些操作共享数据的语句只执行了一部分,这时候有了另外一个线程参与了进来,这时候就可能出现线程安全的问题。。这样理解对吗??
回复 使用道具 举报
saralihuan1992 发表于 2015-3-11 13:21
那我可以理解成:当线程要操作的数据是多个线程共享的数据时,并且有多条语句对该共享数据进行了操作,而 ...

是的。就像多窗口同时卖票,A窗口判断了有最后一张票,还没打印出来就停止工作了。然后B窗口也判断了最后一张票并打印卖出去了。接着A窗口继续工作时就会进行打印工作,就出问题了。
回复 使用道具 举报
出现线程并发情况,比如卖火车票  有三个窗口 可能会在同一时间卖同一张票,面对这种情况我们会引入入一种 安全锁 解决上面问题!!

韩顺平.循序渐进学.java.从入门到精通.第41讲-坦克大战8_2015311121035.JPG (191.82 KB, 下载次数: 2)

韩顺平.循序渐进学.java.从入门到精通.第41讲-坦克大战8_2015311121035.JPG

线程-同步锁.JPG (169.31 KB, 下载次数: 21)

线程-同步锁.JPG

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马