[java] 简单的ConcurrentHashMap

ConcurrentMap和Guava的LocalCache实现原理相近,底层的存储方式使用的时table方式来存储。这里使用最简单且最暴力的方式,在每次访问的时候均加锁。

ConcurrentHashMap接口:

public interface ConcurrentHashMap<K, V> {

    public V get(K k);

    public void put(K key, V value);

    public void putAll(Iterable<MapEntry<K, V>> kIterator);

    public V remove(K k);
}

  MapEntry:

public class MapEntry<K, V> {

    private K key;

    private V value;

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }
}

  SimpleConcurrentHashMap接口:

import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Iterator;

public class SimpleConcurrentHashMap<K, V> implements ConcurrentHashMap<K, V> {

    private final HashMap<K, V> cache = Maps.newHashMap();

    public SimpleConcurrentHashMap() {
    }

    @Override
    public V get(K k) {
        Preconditions.checkNotNull(k);
        synchronized (cache) {
            return cache.get(k);
        }
    }

    @Override
    public void put(K key, V value) {
        Preconditions.checkNotNull(key);
        Preconditions.checkNotNull(value);
        synchronized (cache) {
            cache.put(key, value);
        }
    }

    @Override
    public void putAll(Iterable<MapEntry<K, V>> entryIterable) {
        Preconditions.checkNotNull(entryIterable);
        Iterator<MapEntry<K, V>> iterator = entryIterable.iterator();
        while (iterator.hasNext()) {
            MapEntry<K, V> next = iterator.next();
            this.put(next.getKey(), next.getValue());
        }
    }

    @Override
    public V remove(K k) {
        Preconditions.checkNotNull(k);
        synchronized (cache) {
            return cache.remove(k);
        }
    }
}

  

时间: 2024-10-05 04:19:35

[java] 简单的ConcurrentHashMap的相关文章

死磕 java集合之ConcurrentHashMap源码分析(三)

本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作. public V remove(Object key) { // 调用替换节点方法 return replaceNode(key, null, null); } final V replaceNode(Object key, V

zoj Fibonacci Numbers ( java , 简单 ,大数)

题目 //f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2) import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger an(int n) { BigInteger c; BigInteger a = BigInteger.valueOf(1); BigInteger b = BigIn

rabbitmq的java简单实现

1,安装rabbitmq.我的是ubuntu14.04,在官网上面下载最新的安装文件http://www.rabbitmq.com/install-debian.html 2.安装完之后  启动rabbitmq, sudo rabbitmq-server 3.下载jar包 4.最简单的hello world的实现 Sender类 package com.lubby.test; import java.io.IOException; import com.rabbitmq.client.Chann

Java简单聊天室

实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发送消息,并且接收消息 * 1.1 消息发送至服务器:服务器每次都将客户发过来的信息发送到每个客户端 * 1.2 接收消息:发送的同时也要接收消息,所以必须有两个线程,一个发送消息,一个接收消息 * 1.3 关于这两个线程:如果没有线程,接收和发送就是按顺序执行的了,那么是发送后接收还是接收后发送?或

HDU 1715 大菲波数(JAVA, 简单题,大数)

题目 //BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数 import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger an(BigInteger a, BigInteger b, int n) { if(n == 1) { return a; } for(int i = 2

Java简单语法与访问权限修饰符

Java简单语法总结 一:Java简单语法概述 1:分号,关键字,空白(空格,空白行),花括号和注释的使用. 2:标识符的规则(命名规则与业内约定). 3:Java表达式(逗号,问号和逻辑表达式). 二:分号,关键字,空白(空格,空白行),花括号和注释的使用 1:分号  在Java中通常用来分隔语句,即作为分隔符,另外它也是一个语句结束的标志. 2:关键字 通俗的理解,在编译器Eclipse中像"public","class"这些输入的时候就带有颜色的字成为关键字,

POJ 3982 序列(JAVA,简单,大数)

题目 //在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, //可以先建立对象,然后通过对象调用方法: import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger a99(BigInteger a, BigInteger b, BigInteger c) { f

JAVA简单Swing图形界面应用示例

package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗口 * @author lenovo * */ public class HelloSwing { public static void main(String[] args) { JFrame frame=new JFrame("hello Swing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLO

dubbox部署到jdk1.7环境,启动:java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()

本地用jdk1.8编译的服务提供端war包,部署到环境报错了: INFO: Initializing Spring root WebApplicationContext [16/08/17 05:14:54:054 CST] localhost-startStop-1 INFO context.ContextLoader: Root WebApplicationContext: initialization started [16/08/17 05:14:54:054 CST] localhos