博客
关于我
JAVA高并发集合详解
阅读量:407 次
发布时间:2019-03-05

本文共 3497 字,大约阅读时间需要 11 分钟。

Java多线程容器深入解析

Queue(队列)和Deque(双端队列)是处理高并发场景的核心容器。Deque比普通的队列更灵活,支持从任一端添加和移除元素,常见用途是线程安全的生产者-消费者模型。

Hashtable的性能测试

Hashtable在早期JDK版本中因加锁导致性能瓶颈,后续开发者通过ConcurrentHashtable优化,但其性能仍不如现代的ConcurrentHashMap。通过本地测试发现,ConcurrentHashMap在插入操作上与Hashtable效率无明显差异,但在读取时效率显著提升。

public class T01_TestHashtable {    static final int COUNT = 1000000;    static final int THREAD_COUNT = 100;    public static void main(String[] args) throws InterruptedException {        long start = System.currentTimeMillis();        final MyThread[] threads = new MyThread[THREAD_COUNT];        for (int i = 0; i < threads.length; i++) {            threads[i] = new MyThread(i * (COUNT / THREAD_COUNT));        }        for (MyThread t : threads) {            t.start();        }        for (MyThread t : threads) {            t.join();        }        long end = System.currentTimeMillis();        System.out.println(end - start);        System.out.println(m.size());    }    static Hashtable
m = new Hashtable<>(); static class MyThread extends Thread { int start; int gap = COUNT / THREAD_COUNT; MyThread(int start) { this.start = start; } @Override public void run() { for (int i = start; i < start + gap; i++) { m.put(keys[i], values[i]); } } }}

ConcurrentSkipListMap的跳表优化

ConcurrentSkipListMap采用跳表结构,通过CAS算法实现并发安全。其底层是基于链表的结构,通过跳跃查找减少了树操作的复杂性,显著提升了查找效率。

多线程编程的最佳实践

  • 优先使用Queue

    • 队列是线程安全的容器,适合生产者-消费者模式。
    • 避免使用List和Set,除非确实需要集合操作。
  • CopyOnWrite机制

    • CopyOnWriteArrayList在写操作时加锁,通过复制实现并发安全。
    • 读操作不加锁,直接读取副本,性能优于传统同步ArrayList。
  • BlockingQueue的多样实现

    • LinkedBlockingQueue:无界队列,适合内存充足的场景。
    • ArrayBlockingQueue:有界队列,适合内存有限的环境。
    • DelayQueue:支持定时任务,延迟执行。
    • synchronusQueue:容量为0,用于线程间数据传递。
  • PriorityQueue:基于小顶堆的优先队列,适合任务调度。

    • 示例:将任务按运行时间排序,优先执行短任务。
  • DelayQueue的任务调度

    static BlockingQueue
    tasks = new DelayQueue<>();static class MyTask implements Delayed { String name; long runningTime; MyTask(String name, long rt) { this.name = name; this.runningTime = rt; } @Override public int compareTo(Delayed o) { if (getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS)) { return -1; } else if (getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS)) { return 1; } else { return 0; } } @Override public long getDelay(TimeUnit unit) { return unit.convert(runningTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } @Override public String toString() { return name + " " + runningTime; }}public static void main(String[] args) throws InterruptedException { long now = System.currentTimeMillis(); MyTask t1 = new MyTask("t1", now + 1000); MyTask t2 = new MyTask("t2", now + 2000); MyTask t3 = new MyTask("t3", now + 1500); MyTask t4 = new MyTask("t4", now + 2500); MyTask t5 = new MyTask("t5", now + 500); tasks.put(t1); tasks.put(t2); tasks.put(t3); tasks.put(t4); tasks.put(t5); System.out.println(tasks); for (int i = 0; i < 5; i++) { System.out.println(tasks.take()); }}

    PriorityQueue的使用示例

    public class T07_01_PriorityQueque {    public static void main(String[] args) {        PriorityQueue
    q = new PriorityQueue<>(); q.add("c"); q.add("e"); q.add("a"); q.add("d"); q.add("z"); for (int i = 0; i < 5; i++) { System.out.println(q.poll()); } }}

    输出结果:a、c、d、e、z

    转载地址:http://ydlzz.baihongyu.com/

    你可能感兴趣的文章
    Python 列表删除相同的元素
    查看>>
    python 列表生成式
    查看>>
    Python 列表解析 大文件
    查看>>
    python 列表转字典方法
    查看>>
    Python 列表(List)概述-ChatGPT4o作答
    查看>>
    Python网络爬虫基础进阶到实战教程
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 包管理器和 Node.js
    查看>>
    Python 单词字母顺序不变且所有倒排
    查看>>
    python 反射机制
    查看>>
    python 启动提示IDLE's subprocess didn't make conne...
    查看>>
    python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
    查看>>