日期:2014-05-20  浏览次数:20719 次

线程安全与非线程安全的区别?
一直没感受到,他们到底给我带来什么利弊.拿List下面的两个子类作比较:ArrayList与Vector,其
中ArrayList是非线程安全,Vector是线程安全的.但什么时候用ArrayList,什么时候用Vector我真不清楚.
希望CSDN上的朋友给我一个好的答案,有例子举证就最好了.

------解决方案--------------------
查看ArrayList和Vector的源码会发现,其实Vector跟ArrayList基本一样,只是把所有改变列表元素的方法和部分跟位置或变化有关系的查询方法加上了synchronized。

可以这样理解:
1、如果List不会被多线程并发访问,使用ArrayList就没有问题;
2、如果有多线程并发访问List,可以使用Vector,也可以使用ArrayList,并且自己对可能出现并发冲突的地方自行做synchronized处理。
------解决方案--------------------
探讨
简单的来讲,在多线程情况下 vector.add(e),这样写就好了,如果你用ArrayList.add(e),那么你就得这样

synchronized(ArrayList)
{
ArrayList.add(e)
}

vector为什么不需要这样了?因为内部已经做了这样的处理了

------解决方案--------------------
线程安全对共享变量互斥访问 
非。。。。。。不是
所以要是线程间数据相关则而又不是线程安全的话,很危险的


 
------解决方案--------------------
同一个ArrayList可以被多个用户(线程)同时访问
而同一个vector,A线程在访问的时候,B线程不能访问而挂起,等A释放对vector的锁以后B再访问。
所以ArrayList有可能出现这样的情况:

线程A,B同时访问ArrayList C
他们都读出C的第五个元素是1000(假设第五个元素是表示5仓库的库存),这时候A线程因为其他原因挂起了,而B还在执行

那么B线程显示还有1000个存货,B根据他卖出的货量修改第五个元素为:1000-200=800.

这时候A线程回来了,他也开始继续执行,他也卖出100个货物,他开始修改,结果他修改为1000-100=900.

这时候就出现问题了,实际只有700货,显示的却是900

而vector不会,A访问的时候显示1000,B再来访问就不能访问,当A修改完毕后,B才能访问,显示为800,这样就不会出现问题
------解决方案--------------------
直接从字面意思理解就可以了
线程安全就是在多线程环境下也不会出现数据不一致,而非线程安全就有肯能出现数据不一致
线程安全的类由于要确保线程安全增加了一定的开销,所以在单线程环境中效率没非线程安全的类效率高
http://www.diybl.com/course/4_webprogram/jsp/jsp_js/20090304/157682.html
------解决方案--------------------
探讨
同一个ArrayList可以被多个用户(线程)同时访问
而同一个vector,A线程在访问的时候,B线程不能访问而挂起,等A释放对vector的锁以后B再访问。
所以ArrayList有可能出现这样的情况:

线程A,B同时访问ArrayList C
他们都读出C的第五个元素是1000(假设第五个元素是表示5仓库的库存),这时候A线程因为其他原因挂起了,而B还在执行

那么B线程显示还有1000个存货,B根据他卖出的货量修改第五个元素为:1000-200=800.…

------解决方案--------------------
没感受是因为没有操作过哇

你弄2个线程同时用你的arraylist 你试一下就会发现在灵界状态特别容易有问题哇

然后你再搞下vector 你就不会再没感觉了哇
------解决方案--------------------
探讨
同一个ArrayList可以被多个用户(线程)同时访问
而同一个vector,A线程在访问的时候,B线程不能访问而挂起,等A释放对vector的锁以后B再访问。
所以ArrayList有可能出现这样的情况:

线程A,B同时访问ArrayList C
他们都读出C的第五个元素是1000(假设第五个元素是表示5仓库的库存),这时候A线程因为其他原因挂起了,而B还在执行

那么B线程显示还有1000个存货,B根据他卖出的货量修改第五个元素为:1000-200=800.…

------解决方案--------------------
那是你没用到啊,比如我举个很简单的例子,你有1000种货物,用JList对外显示(C/S模式),每个client都可以修改,当你某段时间内修改很频繁的时候,你不可能,一改就直接修改数据库吧,那要发多少update语句啊。你当然是修改JList里的Vector啦,最后再把Vector统一再update进去。
至于你说的WEB项目,如果你用hibernate,你也会要用啊,因为他里面有个状态不是叫持久态,修改Vector就修改数据库了。