HashMap的get方法为空解读

来源:互联网 发布:登录阿里云邮箱登陆 编辑:程序博客网 时间:2024/06/06 03:04
package cn.itcast.heima2;import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadScopeShareData {private static Map <Thread,Integer>threadData=new HashMap<Thread,Integer>();public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable() {public void run() {int data=new Random().nextInt();System.out.println(Thread.currentThread().getName()+" has put data:"+data);threadData.put(Thread.currentThread(), data);new A().get();}}).start();}}static class A{public void get(){try {Integer data=threadData.get(Thread.currentThread());System.out.println("from "+Thread.currentThread().getName()+" get data:"+data);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}


/*

void addEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);        if (size++ >= threshold)            resize(2 * table.length);    }

在hashmap做put操作的时候会调用到以上的方法。现在假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失
*/

原创粉丝点击