黑马程序员技术交流社区

标题: 线程安全问题 [打印本页]

作者: saralihuan1992    时间: 2015-3-11 12:27
标题: 线程安全问题
线程安全这一直不是很明白,什么情况下会出现线程安全的问题呢?有哪些解决方案呢?最好的解决方案是什么?在此请教各位:)
作者: 健健    时间: 2015-3-11 12:44
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,就可能导致共享数据的错误。
作者: 邓士林    时间: 2015-3-11 12:46
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素1存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B向此 ArrayList 添加元素2,因为此时 Size 仍然等于
作者: saralihuan1992    时间: 2015-3-11 13:11
健健 发表于 2015-3-11 12:44
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与 ...

好的,谢谢
作者: saralihuan1992    时间: 2015-3-11 13:21
健健 发表于 2015-3-11 12:44
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与 ...

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

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

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

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

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

线程-同步锁.JPG





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2