哪些线程是安全的_redis是线程安全的吗

哪些线程是安全的_redis是线程安全的吗Java中平时用的最多的map就是hashmap但是它却是线程不安全的。那除了hashmap还有哪些常见的线程安全的map?1.hashtableMap<String,Object>hashtable=newHashtable<String,Object>();这是所有人最先想到的,那为什么她是线程安全的?那就看看她的源码,我们可以看出我们常用的put,get,…

大家好,又见面了,我是你们的朋友全栈君。

Java中平时用的最多的map就是hashmap但是它却是线程不安全的。
那除了hashmap还有哪些常见的线程安全的map?
1.hashtable
Map<String,Object> hashtable=new Hashtable<String,Object>();

这是所有人最先想到的,那为什么它是线程安全的?那就看看它的源码,我们可以看出我们常用的put,get,containsKey等方法都是同步的,所以它是线程安全的

public synchronized boolean containsKey(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return true;
            }
        }
        return false;
    }

 public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
        return null;
    }
     public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }

        addEntry(hash, key, value, index);
        return null;
    }

2.synchronizedMap
Map<String,Object> synchronizedMap= Collections.synchronizedMap(new Hashtable<String,Object>());
它其实就是加了一个对象锁,每次操作hashmap都需要先获取这个对象锁,这个对象锁有加了synchronized修饰,锁性能跟hashtable差不多。

SynchronizedMap(Map<K,V> m, Object mutex) {
            this.m = m;
            this.mutex = mutex;
        }

        public int size() {
            synchronized (mutex) {return m.size();}
        }
        public boolean isEmpty() {
            synchronized (mutex) {return m.isEmpty();}
        }
        public boolean containsKey(Object key) {
            synchronized (mutex) {return m.containsKey(key);}
        }
        public boolean containsValue(Object value) {
            synchronized (mutex) {return m.containsValue(value);}
        }
        public V get(Object key) {
            synchronized (mutex) {return m.get(key);}
        }

3、ConcurrentHashMap
Map<String,Object> concurrentHashMap=new ConcurrentHashMap<String,Object>();

这个是目前使用最多,而且也是最推荐的一个集合,实现也是比较复杂的一个。我们看源码其实是可以发现里面的线程安全是通过cas+synchronized+volatile来实现的,其中也可看出它的锁是分段锁,所以它的性能相对来说是比较好的。整体实现还是比较复杂的。

——————————————–写的不好,仅供参考——————————

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124669.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • iconfont的使用方法

    iconfont的使用方法一、iconfont的使用登录http://www.iconfont.cn/阿里巴巴矢量图标库,github或微博登录 选择喜欢的图标添加入库 然后点击右侧购物车,点击最下面的‘下载代码’按钮,下载保存到本地,解压即可得到需要的文件 有三种方法使用(1)unicode引用unicode是字体在网页端最原始的应用方式,特点是:兼容性最好,支持ie6+,及所有现代浏览器。 支持…

    2022年10月26日
  • 电脑图标变成空白图标怎么改回来_win7去掉桌面图标箭头

    电脑图标变成空白图标怎么改回来_win7去掉桌面图标箭头在桌面添加常用软件快捷图标对我们平时使用程序更加快捷,但在使用过程中难免会遇到一些棘手问题。近日有用户使用的win7操作系统发现桌面图标变异常,桌面软件图标都变得白色或未知图标(如下图所示),导致无法正常打开软件程序,出现这种现象很有可能是桌面图标缓存出现问题,下面是豆豆整理的各种纠结方法,如果用户也出现此种故障问题的话,不妨按照下面的某种方法来修复试试。解决方法一:首先在Win7桌面空白处点击鼠…

    2022年10月10日
  • python源代码下载_python源码解析

    python源代码下载_python源码解析python源码下载 (2010-12-1823:11)不知道python.org一直被堵在墙外… 1、http://ftp.python.org/ftp/python/ 2、http://www.python.org/ftp/python/

  • 关于iptabels的-A与-I参数

    关于iptabels的-A与-I参数

  • javaweb酒店管理系统设计与实现_酒店管理信息系统分析与设计

    javaweb酒店管理系统设计与实现_酒店管理信息系统分析与设计随着人们生活质量的提高和对网络的依赖,对酒店的需求量越来越大并且更需要网络来实现预订酒店等功能,它作为一个服务性行业,从客房的营销即客人的预定开始,到入住登记直到最后退房结账,整个过程应该能够体现以宾客为中心,提供快捷方便服务,给宾客感受一种顾客至上的享受,提高管理水平,简化各种复杂操作,在最短时间内完成酒店业务规范操作,这样才能令旅客舒适难忘。目前,我国酒店服务业信息化管理的进程缓慢,跟国外的酒店相比管理依然落后。在激烈的酒店业竞争中,如何能把握机会,保持自己的优势,立于不败之地呢?这就需要提供最好的服务

  • Nginx学习——Nginx简单介绍和Linux环境下的安装

    Nginx 是一个俄罗斯的哥们开发的,并将其进行了开源。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号