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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁健 黑马帝   /  2011-11-20 19:17  /  1966 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程在运行的时候为什么会不安全,看玩视频还是很模糊,求详解!!!!!!!!1

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 其实很简单

查看全部评分

6 个回复

倒序浏览
因为多线程容易出现线程并发的问题,并发就是指同一个方法有可能同时被两个人调用,这样就会出现线程安全问题,建议多看看视频和敲代码,现在我也还没有完全理解,不过相信多看视频多敲代码应该很快可以理解.

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多线程同步,就是线程交互执行,已达到程序同时执行,线程会抢资源,即抢CPU执行权,当一个线程执行一个函数时,执行到一半,有可能被其他的线程抢去执行权,这个线程就遇到了阻塞状态,必须抢过来执行权才能继续执行。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
赵超 黑马帝 2011-11-21 00:28:06
板凳
出现的问题就是线程之间会出现并发,因为cpu在执行程序的时候是根据时间片来进行的,也就是在执行一段函数的时候突然中断,cpu跑去执行另一段代码(也就是资源被抢占了),先前的那段程序就需要重新进行排队,等待下一次时间片轮换的时候继续执行。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
当多个线程并发执行的时候,其实是对处理机资源的轮转调度,这样就很容易的产生死锁(多个线程对同一资源的竞争,占有这个资源的线程又在等待其他的资源而不能得到)。因此,引入wait()/notify()(or notifyAll())是很有必要的:当条件不满足的的时候(注意wait()方法要在synchronized块中),调用wait()方法解锁,使其进入“等待”状态,以便资源释放给其他线程使用;当有另外的“动作”导致系统状态发生改变(使刚刚的条件满足),对应的需要使用notify()或者notifyAll()方法来唤醒等待的线程,将唤醒的线程放入就绪队列(notify()也需要放在synchronized块中,与wait()相对应,如果不用notify的话线程将永远处于等待状态导致死锁)。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
比如一个 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。这就是“线程不安全”了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
崔浩 黑马帝 2011-11-21 07:49:20
7#
线程的安全问题,和数据库的并发处理机制是一样的,当一个线程修改一个数据的时候,这个线程还没有修改完毕,cpu资源被切换到了另外一个线程上去了,如果另外一个线程修改了这个数据,如果这个数据作为条件语句的时候,有可能为假,但是可能执行,也有可能为真,但是不执行的情况

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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