`
pengwei841221
  • 浏览: 71092 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

线程安全&线程不安全

阅读更多

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

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

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

 

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

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

 

线程的工作原理: 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,这就是"线程不安全"了

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics