群裡某網友提問如下:
@Ay叔 一個static 的MAP 裡面 存了一個 例項..兩條執行緒訪問這個MAP 取這例項. 那麼取到的是同一個 還是 兩個不同的例項?
複製程式碼
為了這個問題,寫了一段程式碼進行測試,並得到如下結論:
一個map中的值,在多個執行緒中操作,在只傳址的前提下,值是會不停改變的,而且所有的引用都跟著一起改變。
複製程式碼
測試程式碼如下:
package mthashmap;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public class MT_HashMap {
public static ConcurrentHashMap<String, value> map = new ConcurrentHashMap<String, value>();
public static void main (String[] args){
map.put("key",new value("value"));
new Thread(new Runnable(){
public synchronized void run() {
value v = map.get("key");
System.out.println("mt1 oldkey=" + v);
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("mt1 mapkey = "+map.get("key"));
System.out.println("mt1 key="+v);
// map.put("key",new value("old value"));
v.set("old value");
}
}).start();
new Thread(new Runnable(){
public synchronized void run() {
try {
Thread.currentThread().sleep(200);
value v = map.get("key");
System.out.println("mt2 key="+v);
v.set("new value");
// map.put("key",new value("new value"));
System.out.println("mt2 mapkey="+map.get("key"));
Thread.currentThread().sleep(1500);
System.out.println("mt2 key="+v);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
static class value{
String str;
public value(String str){
this.str = str;
}
public void set(String str){
this.str = str;
}
public String toString(){
return str;
}
}
}
複製程式碼