线程安全的三个条件:
1 代码的顺序性
2 操作原子性
3 内存可见性
【其中第二条,其中一个线程扩展map空间时,其他线程执行put操作,会出现并发问题。】这是所有相关资料都提及的一个重要问题。
最近在牛客网上做题,经常出现HashMap的线程安全性问题,每次看后不求甚解,
发现还是不怎么会。所以结合网上资料分析分析。
package concurrentHashMap;
import java.util.HashMap;
class Thread1A extends Thread{
private MyService1 service;
public Thread1A(MyService1 service){
super();
this.service=service;
}
public void run(){
for(int i=0;i<50000;i++){
service.map.put("threadA"+(i+1),"threadA"+i+1);
System.out.println("threadA"+(i+1));
}
}
}
class Thread1B extends Thread{
private MyService1 service;
public Thread1B(MyService1 service){
super();
this.service=service;
}
public void run(){
for(int i=0;i<50000;i++){
service.map.put("threadB"+(i+1),"threadB"+i+1);
System.out.println("threadB"+(i+1));
}
}
}
public class MyService1 {
public HashMap map = new HashMap();
}
单线程下:
package concurrentHashMap;
public class Test1 {
public static void main(String[] args){
MyService1 service = new MyService1();
Thread1A thread1a = new Thread1A(service);
thread1a.start();
}
}
单线程下操作数据HashMap不会出现任何问题。
而多线程下:
package concurrentHashMap;
public class Test2 {
public static void main(String[] args){
MyService1 service = new MyService1();
Thread1A thread1a = new Thread1A(service);
Thread1B thread1b = new Thread1B(service);
thread1a.start();
thread1b.start();
}
}
数据量小时没有发现什么问题,但是数据量很大时,
发现丢失了大量的数据。线程肯定不安全了。。
想要线程安全的使用HashMap也有三种办法:
—Hashtable
—ConcurrentHashMap
—Synchronized Map
好像不是很了解解决办法,留着下次解决吧。。