博客
关于我
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/

    你可能感兴趣的文章
    PyQt4参考文档
    查看>>
    PyTorch Lightning:通过分布式训练扩展深度学习工作流
    查看>>
    PyQt5 - QThread:在线程仍在运行时被销毁
    查看>>
    PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
    查看>>
    PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
    查看>>
    PyQt5 QLCNumber 没有更新
    查看>>
    PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
    查看>>
    PyQt5 从 PyQt4 转换信号代码
    查看>>
    PyQt5 和 asyncio:从永不完成的收益
    查看>>
    PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
    查看>>
    PyQt5 按钮运行功能和更新 LCD
    查看>>
    pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
    查看>>
    pyqt5 设置控件在最上层或者在下层
    查看>>
    pyqt5 设置网格布局的间距
    查看>>
    pyTorch Hub 系列#4:PGAN — GAN 模型
    查看>>
    PyQt5-基本窗口控件-QMainWindow
    查看>>
    PyQt5:如何安装/运行 Qt 设计器
    查看>>
    PyQt5——pyqtgraph绘图大招
    查看>>
    PyQt5——多窗口之间数据处理
    查看>>
    PyQt5——多线程、信号与槽
    查看>>