博客
关于我
JAVA高并发集合详解
阅读量:406 次
发布时间: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/

    你可能感兴趣的文章
    PL SQLDEVELOPMENT导出数据库脚本
    查看>>
    Queue
    查看>>
    PL/SQL Developer中文版下载以及使用图解(绿色版)
    查看>>
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>
    PL/SQL连接远程服务器数据库,出现ORA-12154: TNS: 无法解析指定的连接标识符。
    查看>>
    pl/sql锁
    查看>>
    PL2303 Windows 10 驱动项目常见问题解决方案
    查看>>
    QueryPerformanceCounter与QueryPerformanceFrequency
    查看>>
    Plaid.com的监控系统如何实现与9600多家金融机构的集成
    查看>>
    Plain Stock Prediction:基于RNN的股票价格预测工具
    查看>>
    platform_driver与file_operations两种方法开发led驱动
    查看>>
    PlatON共识方案详解:应用CBFT共识协议,提高共识效率
    查看>>
    QueryDict和模型表知识补充
    查看>>
    Querybase 使用与安装教程
    查看>>
    Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
    查看>>