当前位置: 首页 > 知识库问答 >
问题:

在我的情况下是锁+HasMap还是ConcurrentHashMap?

戎元忠
2023-03-14
    private static ReentrantLock lock_Vqueue = new ReentrantLock();
    private static HashMap<String,Queue<DocumentObjectHolder>> cacheData = new HashMap<String,Queue<DocumentObjectHolder>>();
        /**
         * insert element in the tail 
         * sort the elements by priority 
         * @param obj a DocumentObjectHolder Object
         */
        public static void add(String key, DocumentObjectHolder obj){
            ReentrantLock lock = lock_Vqueue; //performance side effect
            try{
                Queue<DocumentObjectHolder>priorityProcessingVirtualQueue;
                lock.lock();
                    if (!cacheData.containsKey(key)){
                        priorityProcessingVirtualQueue = new PriorityQueue<DocumentObjectHolder>(1, new PriorityComparator());
                        cacheData.put(key, priorityProcessingVirtualQueue);
                    }
                    priorityProcessingVirtualQueue = cacheData.get(key);
                    priorityProcessingVirtualQueue.add(obj);
                    cacheData.put(key, priorityProcessingVirtualQueue);
            }finally {
                lock.unlock();
            }
        }

        /**
         * 
         * @return DocumentObjectHolder instance from head of list (FIFO)
         */
        public DocumentObjectHolder get(String key){
            ReentrantLock lock = lock_Vqueue; //performance side effect
            Queue<DocumentObjectHolder>priorityProcessingVirtualQueue;
            try {
                lock.lock(); 
                 if (cacheData.containsKey(key)){
                     priorityProcessingVirtualQueue = cacheData.get(key);
                     return priorityProcessingVirtualQueue.poll();
                 }
                 return null;
            }finally{
                lock.unlock();
            }
        }
}

这个代码是正确的还是性能更好?

共有1个答案

柴衡
2023-03-14

因此您有两个单独的原子指令需要与之同步。

  1. 将新队列放入映射
  2. 将对象放入队列

以下是我的建议。

    public static void add(String key, DocumentObjectHolder obj){
        Queue<DocumentObjectHolder> priorityProcessingVirtualQueue= cacheData.get(key);
        if(priorityProcessingVirtualQueue== null){
             Queue<DocumentObjectHolder> temp = new PriorityQueue<DocumentObjectHolder>(1, new PriorityComparator());
             queue = cacheData.putIfAbsent(key, temp);
             if(priorityProcessingVirtualQueue== null){ 
                  priorityProcessingVirtualQueue= temp;
             } 
        }
        synchronized(priorityProcessingVirtualQueue){
            priorityProcessingVirtualQueue.add(obj);
        }
    }
 类似资料:
  • 【8.28 美团到店事业群一面(9.1收到感谢信)】 问题: 1、 手撕算法,链表公共头节点 2、实习项目,技术难点 3、前端前沿技术以及对chatgbt应用的了解(主要说了端智能,kotlin跨平台新框架、还有自己公司的gbt在产品上的应用) 反问: 1、面试官所在组内的相关chatgbt产品(他说了点评智能生成) 【9.2 小红书一面(秒挂)】 问题: 1、 实习项目,技术难点 2、 对小程序

  • 在Java中,如何在不使用条件或三元运算符的情况下确定一个数字是奇数还是偶数? 这个问题是我的老师提出的。他还给了我一个提示,使用位运算符是可能的。

  • 问题内容: 我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以不锁定生产数据库? 我目前正在使用: 但是它在运行时锁定每个表。 问题答案: 该选项有效吗? 根据手册页,如果要转储InnoDB表,则可以使用以下选项: 对于 innodb DB :

  • 我在许多关于可重入锁的教程中看到,它们创建一个新的可重入锁并注入资源,可重入锁的锁定和解锁在try/finally块中调用。我不理解这个锁和线程中使用的资源之间的连接。下面是一个关于可重入锁的教程示例 资源代码 线程声明代码中使用的资源 有人能解释一下,这是如何防止多个线程同时访问给定的资源,从而导致争用情况的???这个可重入锁是在资源中创建对象级锁还是类级锁???

  • 问题内容: 我正在学习CopyOnWriteArrayList类。 复制新阵列的目的是什么? 是其他线程读取数组吗? 因此,如果系统具有高并发性,并且大多数线程的操作都在读取而不是写入,那么最好使用。 问题答案: 如该链接所述: CopyOnWriteArrayList是Java 5并发API中引入的并发Collection类,以及它在Java中流行的表亲。 工具列表界面类似,并且但它的一个线程安

  • 问题内容: 我正在尝试使用Swing制作可缩放的地图。该地图是JScrollPane中的JPanel。放大后,地图会更改大小,而paint()会将元素绘制在不同的位置。这一切都很好。 但是,ScrollPane不会在增加图像大小的同时更改视口,因此放大始终会将我正在查看的元素移出屏幕。我尝试使用来解决此问题,但是由于无法完成几何设计或者因为我不太了解Swing,所以我无法为矩形获取正确的坐标。 这