黑马程序员技术交流社区

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

作者: 梁健    时间: 2011-11-20 19:17
标题: 多线程的安全问题!
多线程在运行的时候为什么会不安全,看玩视频还是很模糊,求详解!!!!!!!!1
作者: 吴雨翔    时间: 2011-11-20 22:44
因为多线程容易出现线程并发的问题,并发就是指同一个方法有可能同时被两个人调用,这样就会出现线程安全问题,建议多看看视频和敲代码,现在我也还没有完全理解,不过相信多看视频多敲代码应该很快可以理解.
作者: 肖瑞军    时间: 2011-11-20 22:57
多线程同步,就是线程交互执行,已达到程序同时执行,线程会抢资源,即抢CPU执行权,当一个线程执行一个函数时,执行到一半,有可能被其他的线程抢去执行权,这个线程就遇到了阻塞状态,必须抢过来执行权才能继续执行。
作者: 赵超    时间: 2011-11-21 00:28
出现的问题就是线程之间会出现并发,因为cpu在执行程序的时候是根据时间片来进行的,也就是在执行一段函数的时候突然中断,cpu跑去执行另一段代码(也就是资源被抢占了),先前的那段程序就需要重新进行排队,等待下一次时间片轮换的时候继续执行。
作者: 赵磊5    时间: 2011-11-21 00:47
当多个线程并发执行的时候,其实是对处理机资源的轮转调度,这样就很容易的产生死锁(多个线程对同一资源的竞争,占有这个资源的线程又在等待其他的资源而不能得到)。因此,引入wait()/notify()(or notifyAll())是很有必要的:当条件不满足的的时候(注意wait()方法要在synchronized块中),调用wait()方法解锁,使其进入“等待”状态,以便资源释放给其他线程使用;当有另外的“动作”导致系统状态发生改变(使刚刚的条件满足),对应的需要使用notify()或者notifyAll()方法来唤醒等待的线程,将唤醒的线程放入就绪队列(notify()也需要放在synchronized块中,与wait()相对应,如果不用notify的话线程将永远处于等待状态导致死锁)。
作者: zhou_411424    时间: 2011-11-21 07:47
比如一个 ArrayList集合,在添加一个元素的时候,它可能会有两步来完成:
1. 在 Items[Size] 的位置存放此元素;
2. 增大 Size 的值。   
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。   那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
作者: 崔浩    时间: 2011-11-21 07:49
线程的安全问题,和数据库的并发处理机制是一样的,当一个线程修改一个数据的时候,这个线程还没有修改完毕,cpu资源被切换到了另外一个线程上去了,如果另外一个线程修改了这个数据,如果这个数据作为条件语句的时候,有可能为假,但是可能执行,也有可能为真,但是不执行的情况





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