小伙伴们大家好,集合大家应该都知道,这是一个可以存储多个元素的集体,那你们知道有着线程安全的集合是什么集合吗?它又有哪些实现方式呢?跟小编一起来浏览浏览吧。
一、什么是线程安全集合?
一般的说,在一个集合当中,如果被多个线程同时操作这个集合,并且还不会导致各种业务数据错乱的集合就被叫做线程安全的集合。
线程安全基础概念
1)、假如,你的代码所在的进程中有多个线程在同时运行,并且这些线程可能会同时运行这段代码。如果每次运行结果都和单线程运行的结果是一样的,且其他的变量的值也和预期的是一样的,这个进程就是线程安全的。
2)、线程安全问题一般都是由全局变量和静态变量所引起的。
3)、如果你的每个线程中对与全局变量和静态变量只有读操作,而没有写操作,一般的说,这些个全局变量就是线程安全的;但如果有多个线程在同时执行写操作,就必须要考虑线程同步了,否则就可能会影响线程安全。
二、线程安全的集合都有哪些?
1)、Vector
Vector是一个可变长度的数组,它类似于ArrayList,但与ArrayList不同的是,Vector是线程安全的,它会给几乎所有的public方法都加上synchronized关键字。但由于加锁会导致性能降低到一定程度,在不需要并发访问同一对象时,这样强制性的同步机制就显得多余,所以Vector现在已经被抛弃啦。
2)、HashTable
HashTable又和HashMap相似,不同的是,HashTable也是线程安全的,它也是给了几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的键,值都不能是null,但HashMap可以,所以它现在也被遗弃了。
3)、Collections
在Vector和HashTable被弃用后,它们相继被ArrayList和HashMap代替,但它们不是线程安全的,所以Collections工具类中提供了相应的包装方法能够把它们包装成线程安全的集合。
如下:
ListsynArrayList = Collections.synchronizedList(new ArrayList()); SetsynHashSet = Collections.synchronizedSet(new HashSet()); MapsynHashMap = Collections.synchronizedMap(new HashMap());
Collections针对了各种集合来声明了一个线程安全的包装类,它在原集合的基础上添加了锁对象,这样就使得集合中的每个方法都能够通过这个锁对象来实现同步。
以上就是关于线程安全集合的一点小知识啦,如果你对它们感兴趣,还想了解更多相关java常见问答知识的话,就请关注我们的网站吧。
推荐阅读: