比如hashmap和hashtable,arrylist和vector这种的,我学的时候都说是xxx不用了,区别是一个安全一个不安全,当然hashtable那个还有个null的区别,为啥要用不安全的呢
比如hashmap和hashtable,arrylist和vector这种的,我学的时候都说是xxx不用了,区别是一个安全一个不安全,当然hashtable那个还有个null的区别,为啥要用不安全的呢
你开车需要系安全带,骑摩托车需要带头盔,但是并不代表你在家睡觉也要系安全带带头盔(当然你不嫌麻烦也可以这么干)。
在单线程环境下(~在家睡觉~),你可以使用线程安全或者非现场安全的类,但是非现场安全的类通常性能更高,且在单线程情况下也不存在安全问题。
在多线程的情况下(~开车骑摩托车~),你必须牺牲性能,用线程安全的类。
因为使用场景有并发和非并发的区别。如果非得需要解决线程安全问题,比如集合类,它又提供了一个集合的工具类实现同步。个人理解,先追求速度,这能给用户带来体验,安全性如果需要就还可以扩展。
鱼与熊掌不可兼得,线程安全通常都是要加锁和解锁的,不但会对设计上造成复杂性(比如要想办法避免死锁问题),而且会对性能造成显著的影响。
而绝大多数场景下都是单线程同步模型,压根不用考虑线程安全问题。
如果我理解你的问题正确: 为什么不是所有的Collections都是线程安全的?原因有:
所以说,你的问题看起来有点像:“有总比没有好,用不用是我的事”,答案是:“有不是总比没有好,有是需要付出代价,而这代价通常你不需要付出或尽量避免的”。因为Map/List/...应用的场景通常不需要线程安全的,所以在绝大多数的情况下HashTable/Vector/...被HashMap/ArrayList/...代替了
不线程安全才是默认状态。如果不特意做些事情,基本上没有东西是线程安全。所以谈不上 "放弃"。
不线程安全不等于没用,有一些情况是不需要线程安全的,少做这些事的代码可能更快。
========================我的答案==============================
项目大多数情况都是单线程同步的,不需要考虑多线程问题(也就是线程安不安全)。所以速度快是默认选项,只有到了要用多线程的时候才会去考虑安不安全。
4 回答1.4k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
2 回答733 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.7k 阅读
2 回答1.3k 阅读
什么叫
放弃安全而要速度
。这认识错的太远了,需要线程安全的情况下当然是
必须
要使用线程安全的类型了,不需要自然是可以不用使用了。可以很清楚的看到字节码中将字符串连接编译成
StringBuilder
的方式,我们知道JDK
还提供了一个StringBuffer
线程安全的字符串操作类。那JDK
编译时为什么不选择StringBuffer
来做呢,答案很显然是不需要
,因为这是在一个方法的内部,一个局部变量
是不可能会遇到线程安全
问题的。而
HashMap
与HashTable
也是同理,如果你是局部变量
那只需要选择HashMap
就可以了。如果是全局变量
且会有多个线程同时操作该变量的情况当然是不能选择HashMap
,而是要选择HashTable
这种线程安全的类型,但是现在HashTable
被选择的也会很少是因为有了更好的选择如ConcurrentHashMap
来代替。