MyException - 我的异常网
当前位置:我的异常网» J2SE » 线程安全与非线程安全的区别?解决思路

线程安全与非线程安全的区别?解决思路

www.MyException.Cn  网友分享于:2013-02-03  浏览:23次
线程安全与非线程安全的区别?
一直没感受到,他们到底给我带来什么利弊.拿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就修改数据库了。

文章评论

当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员必看的十大电影
程序员必看的十大电影
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
老程序员的下场
老程序员的下场
为什么程序员都是夜猫子
为什么程序员都是夜猫子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何成为一名黑客
如何成为一名黑客
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
 程序员的样子
程序员的样子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我的丈夫是个程序员
我的丈夫是个程序员
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
中美印日四国程序员比较
中美印日四国程序员比较
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
代码女神横空出世
代码女神横空出世
程序员和编码员之间的区别
程序员和编码员之间的区别
我是如何打败拖延症的
我是如何打败拖延症的
一个程序员的时间管理
一个程序员的时间管理
程序员都该阅读的书
程序员都该阅读的书
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
旅行,写作,编程
旅行,写作,编程
10个调试和排错的小建议
10个调试和排错的小建议
漫画:程序员的工作
漫画:程序员的工作
总结2014中国互联网十大段子
总结2014中国互联网十大段子
鲜为人知的编程真相
鲜为人知的编程真相
程序员的鄙视链
程序员的鄙视链
每天工作4小时的程序员
每天工作4小时的程序员
那些争议最大的编程观点
那些争议最大的编程观点
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有