Java集合源码导读

线程安全

在Java中,线程安全的集合主要分为两大类:同步集合(通过Collections.synchronizedXxx包装)和并发集合java.util.concurrent包中的集合)。以下是常见的线程安全集合及其特点:

1. 同步集合(Synchronized Collections)

这些集合通过Collections.synchronizedXxx方法包装,使得单个操作是线程安全的。但需要注意的是,这些集合在多线程环境下性能较差,因为它们会对整个集合加锁。

  • Vector

    • 线程安全的动态数组,类似于ArrayList,但方法被同步。

    • 示例:

      java复制

      Vector<Integer> vector = new Vector<>();
      vector.add(1);
      vector.add(2);
    • 特点:线程安全,但性能较低。

  • Stack

    • 继承自Vector,实现了后进先出(LIFO)的栈结构。

    • 示例:

      java复制

      Stack<Integer> stack = new Stack<>();
      stack.push(1);
      stack.pop();
  • Hashtable

    • 线程安全的哈希表,类似于HashMap,但不允许键或值为null

    • 示例:

      java复制

      Hashtable<String, Integer> hashtable = new Hashtable<>();
      hashtable.put("key", 1);
  • Collections.synchronizedListCollections.synchronizedMapCollections.synchronizedSet

    • 可以将普通的集合包装成线程安全的集合。

    • 示例:

      java复制

      List<String> list = Collections.synchronizedList(new ArrayList<>());
      Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>());
      Set<String> set = Collections.synchronizedSet(new HashSet<>());

2. 并发集合(Concurrent Collections)

这些集合位于java.util.concurrent包中,通过更细粒度的锁或无锁机制实现高性能的线程安全操作。

  • ConcurrentHashMap

    • 线程安全的哈希表,支持高并发的读写操作。

    • 使用分段锁(Segment)或CAS操作实现高性能。

    • 示例:

      java复制

      ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
      map.put("key", 1);
  • ConcurrentLinkedQueue

    • 线程安全的无界队列,基于链表实现。

    • 使用CAS操作保证线程安全。

    • 示例:

      java复制

      ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
      queue.add(1);
      queue.poll();
  • BlockingQueue接口及其实现类

    • 线程安全的队列,支持阻塞操作。

    • 常见实现类:

      • ArrayBlockingQueue:基于数组的有界阻塞队列。

      • LinkedBlockingQueue:基于链表的可选有界阻塞队列。

      • PriorityBlockingQueue:支持优先级的无界阻塞队列。

      • DelayQueue:支持延迟获取元素的无界阻塞队列。

      • SynchronousQueue:不存储元素的阻塞队列,用于线程间直接传递数据。

      • LinkedTransferQueue:支持传输操作的无界阻塞队列。

    • 示例:

      java复制

      BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
      queue.put(1); // 可能阻塞
      queue.take(); // 可能阻塞
  • CopyOnWriteArrayList

    • 线程安全的动态数组,写操作时会复制整个数组。

    • 适用于读多写少的场景。

    • 示例:

      java复制

      CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
      list.add(1);
  • CopyOnWriteArraySet

    • 线程安全的集合,基于CopyOnWriteArrayList实现。

    • 示例:

      java复制

      CopyOnWriteArraySet<Integer> set = new CopyOnWriteArraySet<>();
      set.add(1);
  • ConcurrentSkipListMapConcurrentSkipListSet

    • 分别是线程安全的有序映射和有序集合,基于跳表实现。

    • 示例:

      java复制

      ConcurrentSkipListMap<String, Integer> map = new ConcurrentSkip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值