如何实现线程安全的HashMap

请写出一个简单的程序代码,辛苦了~我的意思是写出一个简单的程序,使程序中的HashMap在该程序里实现线程安全,我仅仅需要这个例子。... 请写出一个简单的程序代码,辛苦了~
我的意思是写出一个简单的程序,使程序中的HashMap在该程序里实现线程安全,我仅仅需要这个例子。
展开
 我来答
匿名用户
推荐于2017-09-04
展开全部
  有2种办法让HashMap线程安全,分别如下:
  方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。
  方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。
南京新华电脑专修学院
2018-07-28 · 新华电脑教育用心为户提供专业
南京新华电脑专修学院
新华电脑教育用心为户提供专业的电脑相关专业疑问解答
向TA提问
展开全部
有2种办法让HashMap线程安全,分别如下:
方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。
方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
day忘不掉的痛
2015-07-07 · 知道合伙人数码行家
day忘不掉的痛
知道合伙人数码行家
采纳数:62646 获赞数:223941
本人担任公司网络部总经理多年,有充足的网络经验、互联网相关知识和资讯。

向TA提问 私信TA
展开全部
直接用HashTable,HashTable线程安全。
我一般都会hashmap凡是在一个方法内部new并且不传到方法外面的基本上可以用hashmap,线程不安全的时候用currenthashmap。
比如类属性是map或者静态属性map而且会在不同的线程并发执行操作map时。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
daay1986
2009-08-18 · TA获得超过6018个赞
知道大有可为答主
回答量:2208
采纳率:0%
帮助的人:1475万
展开全部
public class MapTest {

public static void main(String[] args) {
final Hashtable<Integer, String> map = new Hashtable<Integer, String>();
map.put(1, "1");
new Thread(new Runnable() {

@Override
public void run() {
Enumeration<String> iterator;
for (int i = 0; i < 5; i++) {
iterator = map.elements();
map.put(i, i + "");
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(MapTest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(iterator.nextElement());
}
}
}).start();
new Thread(new Runnable() {

@Override
public void run() {
Enumeration<String> iterator;
for (int i = 0; i < 5; i++) {
iterator = map.elements();
map.put(i, i + "");
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(MapTest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(iterator.nextElement());
}
}
}).start();
}
}
这是没有异常代码
public class MapTest {

public static void main(String[] args) {
final Hashtable<Integer, String> map = new Hashtable<Integer, String>();
map.put(1, "1");
new Thread(new Runnable() {

@Override
public void run() {
Iterator<Integer> iterator;
for (int i = 0; i < 5; i++) {
iterator = map.keySet().iterator();
map.put(i, i + "");
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(MapTest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(iterator.next());
}
}
}).start();
new Thread(new Runnable() {

@Override
public void run() {
Iterator<Integer> iterator;
for (int i = 0; i < 5; i++) {
iterator = map.keySet().iterator();
map.put(i, i + "");
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(MapTest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(iterator.next());
}
}
}).start();
}
}
这里是有异常代码,Iterator 时产生异常的主要原因,Iterator创建的时候会拿到创建时容器的容量,一个整形数据。 读取的时候就拿这个容量数据先去检查是不是和当前实际容量相等,如果不相等就ConcurrentModificationException异常,相等就开始读数据,所谓线程安全就是一个线程在使用Iterator 读数据的时候,另外线程往里加数据,结果就出现Iterator 保存的容器容量和当前实际容量不等了,就不安全了。
而在hashtable中使用了Enumeration这个线程安全的对象,就是说在另外的线程里加东西的时候他会知道当前容器已经改变,所以使用他是线程安全的。
如果楼主还不明白去开下源代码就知道了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
母蔚蒙林
2019-02-23 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:30%
帮助的人:766万
展开全部
在周二面试时,一面的面试官有问到HashMap是否是线程安全的,如何在线程安全的前提下使用HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap和synchronized
Map的原理和区别。当时有些紧张只是简单说了下HashMap不是线程安全的;Hashtable线程安全,但效率低,因为是Hashtable是使用synchronized的,所有线程竞争同一把锁;而ConcurrentHashMap不仅线程安全而且效率高,因为它包含一个segment数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术。当时忘记了synchronized
Map和解释一下HashMap为什么线程不安全。面试结束后问了下面试官哪里有些不足,面试官说上面这个问题的回答算过关,但可以在深入一些或者自己动手尝试一下。so~~~虽然拿到了offer,但还是再整理一下,不能得过且过啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式