JAVA的MAP.size()出现负数,在网上没找到任何资料,其实只是同步问题的一个例子,看代码就全明白了。

package test_prjmen;

import java.util.HashMap;
import java.util.Vector;

public class TEST_MAPNAG {

/**
* @param args
*/
public static void main(String[] args) {

final HashMap<String,String> map = new HashMap<String,String>();
final Vector<String> strs = new Vector<String> ();
new Thread(){
public void run(){
String name;
//                for (int i=0;i<10;i++){
//                    name =”ABC”+i;
//                    map.put(”ABC”+i,”XYZ”);
//                strs.add(name);
//                }
while (true){

System.out.println(”<<SIZE>>”+map.size());
try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();

for (int i=0;i<100;i++){
new Thread(){
public void run(){
while (true){
synchronized(map){
String name = “ABC”+System.currentTimeMillis();
map.put(name,”XYZ”);
strs.add(name);
}
try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();

new Thread(){
public void run(){
while (true){
String str=null;

if (!strs.isEmpty())
str= strs.remove(0);

//                    synchronized(map){ //如果不加这句话,你就有机会获得负数的SIZE
map.remove(”XYZ”);
//                        try {
//                            sleep(1000);
//                        } catch (InterruptedException e) {
//                            // TODO Auto-generated catch block
//                            e.printStackTrace();
//                        }
map.remove(str);
//                    }

try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}

}

只要加上一个synchronized 就OK了。

continue reading.....