HashMap的get方法为空解读

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 block
				e.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的写入操作丢失
*/

猜你喜欢

转载自blog.csdn.net/shuangyueliao/article/details/78140376
今日推荐