运行以下代码时:
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
public final class ThreadTest {
int N = 4;
Map<Integer, Proxy> proxy = Collections.synchronizedMap(new TreeMap<>());
Proxy p;
public static void main(String[] args) {
new ThreadTest();
}
public ThreadTest() {
Thread[] t = new Thread[N];
for(int c=0;c<N;c++) {
final int i = c;
t[i] = new Thread(() -> {
try {
System.out.println( "From thread: " + i );
p = new Proxy(i);
proxy.put(i, p);
p.init();
} catch (Exception e){}
});
t[i].start();
}
for(int c=0;c<N;c++) {
try {
t[c].join();
} catch (InterruptedException e){}
}
}
public class Proxy {
int index;
public Proxy(int index) {
this.index = index;
System.out.println( "Proxy: " + index );
}
public void init() {
System.out.println("Initializing " + index );
}
}
}
来自方法init()
的打印索引不是唯一的. 以下是输出示例:
From thread: 0
From thread: 1
From thread: 2
From thread: 3
Proxy: 0
Proxy: 3
Proxy: 2
Proxy: 1
Initializing 3
Initializing 3
Initializing 1
Initializing 2
虽然我已经将TreeMap
与Collections.synchronizedMap()
同步,但对于未同步的Map
,结果是相同的. 考虑到它只是一个看跌方法,并且索引已经完全改变,这种行为似乎相当奇怪. 有人能解释一下发生了什么事吗? 谢谢.