1、SynchornizedMap(Map)使用示例代码
HashMap
是一个非同步的collection
类。如果需要对其执行线程安全操作,则必须显式同步它。可以使用使用Collections.synchronizedMap(hashmap)进行同步。
1) SynchornizedMap使用语法
Map map = Collections.synchronizedMap(new HashMap());
//这不需要在同步块中
Set set = map.keySet();
// 在map上同步,不是在set上
synchronized (map) {
// 迭代器必须在同步块中
Iterator iterator = set.iterator();
while (iterator.hasNext()){
...
}
}
2) 使用示例代码
package beginnersbook.com;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
public class HashMapSyncExample {
public static void main(String args[]) {
HashMap<Integer, String> hmap= new HashMap<Integer, String>();
hmap.put(11, "cjavapy");
hmap.put(22, "java");
hmap.put(33, "python");
hmap.put(44, "c#");
hmap.put(88, "linux");
Map map= Collections.synchronizedMap(hmap);
Set set = map.entrySet();
synchronized(map){
Iterator i = set.iterator();
// 显示元素
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
}
}
}
2、ConcurrentHashMap使用示例代码
ConcurrentHashMap是线程安全的,使用锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。与并发环境中的Hashtable相比,它速度更快且具有更好的性能。
package com.concretepage;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConcurrentHashMapDemo {
private final ConcurrentHashMap<Integer,String> conHashMap = new ConcurrentHashMap<Integer,String>();
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(3);
ConcurrentHashMapDemo ob = new ConcurrentHashMapDemo();
service.execute(ob.new WriteThreasOne());
service.execute(ob.new WriteThreasTwo());
service.execute(ob.new ReadThread());
service.shutdownNow();
}
class WriteThreasOne implements Runnable {
@Override
public void run() {
for(int i= 1; i<=10; i++) {
conHashMap.putIfAbsent(i, "A"+ i);
}
}
}
class WriteThreasTwo implements Runnable {
@Override
public void run() {
for(int i= 1; i<=5; i++) {
conHashMap.put(i, "B"+ i);
}
}
}
class ReadThread implements Runnable {
@Override
public void run() {
Iterator<Integer> ite = conHashMap.keySet().iterator();
while(ite.hasNext()){
Integer key = ite.next();
System.out.println(key+" : " + conHashMap.get(key));
}
}
}
}
3、SynchornizedMap(Map)和ConcurrentHashMap区别
SynchornizedMap
是一个方法,HashMap本身非线程安全的,但是当使用 Collections.synchronizedMap(new HashMap())
进行包装后就返回一个线程安全的Map。
ConcurrentHashMap
是Java 1.5中Hashtable
的替代品,是并发包的一部分。使用ConcurrentHashMap
,不仅可以在并发多线程环境中安全地使用它,而且还提供比Hashtable
和SynchornizedMap
更好的性能,这是一个更好的选择。ConcurrentHashMap
性能更好,因为它锁定了Map
的一部分。它允许并发的读操作,同时通过同步写操作保持完整性。