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

本文共 3585 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    opencv9-膨胀和腐蚀
    查看>>
    OpenCV_ cv2.imshow()
    查看>>
    opencv——图像缩放1(resize)
    查看>>
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV轮廓检测提取图像前景
    查看>>
    OpenCV与AI深度学习 | 使用Python和OpenCV实现火焰检测(附源码)
    查看>>
    OpenCV与AI深度学习 | 使用PyTorch进行小样本学习的图像分类
    查看>>
    OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
    查看>>
    OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
    查看>>
    OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计
    查看>>
    OpenCV与AI深度学习 | 初学者指南 -- 什么是迁移学习?
    查看>>
    OpenCV与AI深度学习 | 十分钟掌握Pytorch搭建神经网络的流程
    查看>>