在线程并发中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率非常低
1、线程不安全的HashMap
在多线程,使用HaspMap就行put操作会引起死循环,导致cpu100%。所在在并发情况不能使用HashMap
package com.demo.demo4;
import java.util.HashMap;
import java.util.UUID;
public class Conc {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<String,String>(2);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
map.put(UUID.randomUUID().toString(), "");
}
},"f"+i).start();;
}
}
},"thread");
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry
2、效率低下的HashTable
HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下,因为在一个线程访问HashTable的同步方法,其它线程也访问HashTable的同步方法是,会进入阻塞或轮询状态
3、ConcurrentHashMap的锁分段技术可有效提升并发访问率
HashTable容器在竞争激烈的并发下表现出的效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,加入容器里有多把锁,每一把锁用于容器其中一部分数据,那么当多线程访问容器里不同的数据段是,线程间就不会出现锁竞争,从而可以有效的提高并发效率。将数据分成一段一段的存储,然后给每一段分配一把锁,当前程占用锁访问其中的一个段的数据的时候,其它的数据也能被其它的线程访问