首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线程保险&线程不安全

2012-12-18 
线程安全&线程不安全线程安全是针对多线程来讲的:如果所使用的公用变量在多线程下没有被保护机制时,变量结

线程安全&线程不安全

线程安全是针对多线程来讲的:

如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这就是线程不安全;

相反公用变量在保护机制下工作,就不会出现“随机”变化,这时叫线程安全。

?

线程安全:在多线程中使用时,不用自己做同步处理;

线程不安全:在多线程中使用时,必须做线程同步,不然会有未知后果。

?

线程的工作原理:JVM有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。

可以用synchronized来解决

?

Synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完load到working memory -> use&assign -> store到main memory的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。

?

例如:

vector线程安全  ArrayList非线程安全,但却节约系统性能:一个ArrayList类,在添加一个元素的时候,它可能会有两步来完成:1、在item[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,这就是"线程不安全"了

?

?

?

?

?

热点排行