面试题答案
一键面试- 使用线程安全的集合类
- 原理:Java提供了一些线程安全的集合类,如
Vector
、Hashtable
。Vector
和Hashtable
的方法大多使用synchronized
关键字修饰,在同一时间只允许一个线程访问,从而保证线程安全。 - 适用场景:适用于对线程安全要求较高,且对性能要求不是特别苛刻的场景。因为
synchronized
关键字会带来一定的性能开销,特别是在高并发情况下。
- 原理:Java提供了一些线程安全的集合类,如
- 使用
Collections.synchronizedXxx
方法包装- 原理:
Collections
类提供了一些静态方法,如Collections.synchronizedList
、Collections.synchronizedMap
等。这些方法返回一个线程安全的包装集合,内部同样是通过synchronized
关键字来实现线程同步。例如,Collections.synchronizedList
返回的列表,其方法会在调用时进行同步控制。 - 适用场景:适用于已经使用了非线程安全集合类,又不想完全替换为线程安全集合类的场景。通过简单包装即可实现线程安全,对代码改动较小。
- 原理:
- 使用
ConcurrentHashMap
、CopyOnWriteArrayList
等并发集合类ConcurrentHashMap
原理:ConcurrentHashMap
采用分段锁机制,将整个哈希表分成多个段(Segment),每个段都有自己的锁。在高并发情况下,不同线程可以同时访问不同的段,从而提高并发性能。ConcurrentHashMap
适用场景:适用于读多写少的高并发场景,比如在缓存系统中,大量线程读取数据,少量线程更新数据。CopyOnWriteArrayList
原理:CopyOnWriteArrayList
在进行写操作(如add
、set
等)时,会先复制一份原数组,在新数组上进行操作,操作完成后再将原数组引用指向新数组。读操作则直接读取原数组,由于读操作不会加锁,所以读操作性能很高,但写操作会有一定的开销。CopyOnWriteArrayList
适用场景:适用于读操作远远多于写操作的场景,如事件监听列表,通常注册监听器(读操作)频繁,而添加或移除监听器(写操作)较少。