返回顶部
首页 > 资讯 > 精选 >Java中Map实现线程安全的方式有哪些
  • 115
分享到

Java中Map实现线程安全的方式有哪些

2023-06-29 12:06:18 115人浏览 八月长安
摘要

这篇“Java中Map实现线程安全的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Map实现线程安全的方

这篇“Java中Map实现线程安全的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中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;    }

其实现原理是在增删改查的方法上使用了synchronized机制,在多线程环境下,无论是读数据,还是修改数据,在同一时刻只能有一个线程在执行synchronize方法,因为是对整个表进行锁定。所以线程越多,对该map的竞争越激烈,效率越低,不推荐使用。

方式2.  使用Collections.synchronizedMap(new Hashtable())

其实现原理是使用工具类里面的静态方法,把传入进来的Hashtable包装成同步的,即在增删改查的方法上增加了synchronized所机制,其实现方式与Hashtable差不多,效率也差不多,不推荐使用。

Map map = Collections.synchronizedMap(new Hashtable());

以下是jdk源码

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {        return new SynchronizedMap<>(m);}private static class SynchronizedMap<K,V>        implements Map<K,V>, Serializable {        private static final long serialVersionUID = 1978198479659022715L;         private final Map<K,V> m;     // Backing Map        final Object      mutex;        // Object on which to synchronize         SynchronizedMap(Map<K,V> m) {            this.m = Objects.requireNonNull(m);            mutex = this;        }         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);}        }         public V put(K key, V value) {            synchronized (mutex) {return m.put(key, value);}        }        public V remove(Object key) {            synchronized (mutex) {return m.remove(key);}        }        public void putAll(Map<? extends K, ? extends V> map) {            synchronized (mutex) {m.putAll(map);}        }        public void clear() {            synchronized (mutex) {m.clear();}        }        ......    }

方式3.  使用ConcurrentHashMap

        其实现原理是Hashtable是对整个表进行加锁,而ConcurrentHashMap是把表进行分段,初始情况下分成16段,每一段都有一把锁,当多个线程访问不同的段时,因为获取到的锁是不同的,所以可以并行的访问。效率比Hashtable高多了,推荐使用。

以上就是关于“Java中Map实现线程安全的方式有哪些”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java中Map实现线程安全的方式有哪些

本文链接: https://lsjlt.com/news/324903.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中Map实现线程安全的方式有哪些
    这篇“Java中Map实现线程安全的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Map实现线程安全的方...
    99+
    2023-06-29
  • java中实现线程安全的方式有哪些
    要实现线程安全一般至少需要两个特性:原子性和可见性。实现方式:1)使用synchronize:它本具有原子性和可见性的,所以如果使用了synchronize修饰的操作,那么就自带了可见性,synchronized使用悲观锁来实现线程安全;2...
    99+
    2022-04-13
    java教程 java 线程安全 实现
  • java实现线程安全的方式有哪些
    Java中实现线程安全的方式有以下几种: 使用synchronized关键字:通过在方法前加上synchronized关键字或者...
    99+
    2023-10-27
    java
  • Java中Map实现线程安全的3种方式
    目录方式1.  使用Hashtable方式2.  使用Collections.synchronizedMap(new Hashtable())方式3.  ...
    99+
    2024-04-02
  • java中实现线程安全的方法有哪些
    java中实现线程安全的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和...
    99+
    2023-06-14
  • Java中线程安全有哪些实现思路
    目录1、使用 synchronized 关键字2、使用 ReentrantLock 类3、使用 ConcurrentHashMap 类4、使用 Atomic 类5、使用 Thread...
    99+
    2023-05-20
    Java 线程安全 Java 线程
  • Java中使用ConcurrentHashMap实现线程安全的Map
    目录jdk1.7版本数据结构get()put()size()扩容jdk1.8版本数据结构put()扩容jdk1.7版本 和其他并发集合的区别 待完善 数据结构 fi...
    99+
    2023-05-17
    Java ConcurrentHashMap Java线程安全
  • java多线程实现的方式有哪些
    Java多线程实现的方式有以下几种:1. 继承Thread类:创建一个类继承Thread类,并重写run()方法,在run()方法中...
    99+
    2023-09-15
    java
  • Java实现多线程的方式有哪些
    本篇内容主要讲解“Java实现多线程的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现多线程的方式有哪些”吧!Java多线程实现方式主要有四种:继承Thread类、实现Run...
    99+
    2023-07-02
  • Java中Map的取值方式有哪些
    本篇内容主要讲解“Java中Map的取值方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中Map的取值方式有哪些”吧!Java关于Map的四种取值方式map的主要作用是什么?可以...
    99+
    2023-07-05
  • java中Map遍历的方式有哪些
    这篇“java中Map遍历的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java中Map遍历的方式有哪些”文章吧...
    99+
    2023-07-05
  • 实现多线程的方式有哪些
    本篇文章为大家展示了实现多线程的方式有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现多线程的方式:一,继承Thread方式:特点:多线程多实例,无法实现资源的共享。例子:package&nb...
    99+
    2023-05-31
    多线程
  • java中有哪些实现多线程的方法
    这篇文章将为大家详细讲解有关java中有哪些实现多线程的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基...
    99+
    2023-06-14
  • Java线程实现的方法有哪些
    这篇文章主要介绍“Java线程实现的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程实现的方法有哪些”文章能帮助大家解决问题。继承 Thread 类创建线程类Thread 的实现...
    99+
    2023-06-27
  • Java中有哪些线程调度的方式
    Java中有哪些线程调度的方式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代...
    99+
    2023-06-14
  • java Map的遍历方式有哪些
    Java中的Map接口有多种遍历方式,主要有以下几种方式:1. 使用EntrySet遍历:通过Map的entrySet()方法获取到...
    99+
    2023-09-23
    java
  • java的map遍历方式有哪些
    Java的Map可以使用以下几种方式进行遍历:1. 使用entrySet()方法遍历:通过Map的entrySet()方法获取到所有...
    99+
    2023-08-26
    java map
  • java遍历map的方式有哪些
    Java中遍历Map的方式有以下几种: 使用Iterator遍历:通过Map.entrySet()方法返回的Set集合,使用It...
    99+
    2023-10-21
    java
  • c++实现多线程的方式有哪些
    C++实现多线程的方式有以下几种:1. 使用C++11标准中的std::thread类:通过创建std::thread对象来创建新的...
    99+
    2023-09-21
    c++
  • linux多线程实现方式有哪些
    在Linux系统中,有多种方式可以实现多线程编程。以下是一些常用的方式: pthreads库:pthreads是POSIX线程标...
    99+
    2023-10-25
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作