通过synchronized 关键字给方法加上内置锁来实现线程安全 Timer,TimerTask,Vector,Stack,HashTable,StringBuffer
synchronized
Timer
TimerTask
Vector
Stack
HashTable
StringBuffer
原子类Atomicxxx—包装类的线程安全类 如 AtomicLong,AtomicInteger等等 Atomicxxx 是通过Unsafe 类的native方法实现线程安全的
Atomicxxx
AtomicLong
AtomicInteger
Unsafe
BlockingQueue 和BlockingDeque BlockingDeque接口继承了BlockingQueue接口, BlockingQueue 接口的实现类有 ArrayBlockingQueue , LinkedBlockingQueue , PriorityBlockingQueue 而BlockingDeque接口的实现类有LinkedBlockingDeque BlockingQueue和BlockingDeque 都是通过使用定义为final的ReentrantLock作为类属性显式加锁实现同步的
BlockingQueue
BlockingDeque
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
LinkedBlockingDeque
ReentrantLock
CopyOnWriteArrayList 和 CopyOnWriteArraySet CopyOnWriteArraySet的内部实现是在其类内部声明一个final的CopyOnWriteArrayList属性,并在调用其构造函数时实例化该CopyOnWriteArrayList,CopyOnWriteArrayList采用的是显式地加上ReentrantLock实现同步,而CopyOnWriteArrayList容器的线程安全性在于在每次修改时都会创建并重新发布一个新的容器副本,从而实现可变性。
CopyOnWriteArrayList
CopyOnWriteArraySet
Concurrentxxx 最常用的就是 ConcurrentHashMap ,当然还有ConcurrentSkipListSet和ConcurrentSkipListMap等等。 ConcurrentHashMap使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制—— 分段锁 来实现更大程度的共享
Concurrentxxx
ConcurrentHashMap
ConcurrentSkipListSet
ConcurrentSkipListMap
分段锁
在这种机制中,任意数量的读取线程可以并发访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map,这使得在并发环境下吞吐量更高,而在单线程环境中只损失非常小的性能
ThreadPoolExecutor ThreadPoolExecutor也是使用了ReentrantLock显式加锁同步
ThreadPoolExecutor
Collections中的synchronizedCollection(Collection c)方法可将一个集合变为线程安全,其内部通过synchronized关键字加锁同步
Collections
synchronizedCollection(Collection c)
一、概念:
二、线程安全(Thread-safe)的集合对象:
三、非线程安全的集合对象:
四、相关集合对象比较:
Vector和ArrayList在使用上非常相似,都可以用来表示一组数量可变的对象应用的集合,并且可以随机的访问其中的元素。
2、HashTable: a. 是线程安全的; b. 无论是key还是value都不允许有null值的存在;在HashTable中调用Put方法时,如果key为null,直接抛出NullPointerException异常; c. 遍历使用的是Enumeration列举;
3、HashSet: a. 基于HashMap实现,无容量限制; b. 是非线程安全的; c. 不保证数据的有序;
2、TreeMap: a. 典型的基于红黑树的Map实现,因此它要求一定要有key比较的方法,要么传入Comparator比较器实现,要么key对象实现Comparator接口; b. 是非线程安全的;
1、在执行速度方面的比较:StringBuilder > StringBuffer ; 2、他们都是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度快; 3、 StringBuilder:线程非安全的; 4、StringBuffer:线程安全的;
对于String、StringBuffer和StringBulider三者使用的总结: 1.如果要操作少量的数据用 = String 2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
原文链接:https://blog.csdn.net/tiandao321/article/details/81300489