Ich habe eine Map
, die in Threads x und y geschrieben wird, und lesen Sie in Thread z.java: protokollieren Proto-Objekte in Schleife im synchronisierten Block
Gewinde x:
synchronized (map) {
map.put(0, protoObjX); // protoObjX is a protocol buffer object
}
//...
synchronized (map) {
map.remove(0);
}
Gewinde y:
synchronized (map) {
map.put(1, protoObjY); // protoObjY is a protocol buffer object
}
//...
synchronized (map) {
map.remove(1);
}
Gewinde z:
synchronized (map) {
logger.info(map.values().size()); // prints 2
for (ProtoObjType obj: map.values()) {
logger.info(obj); // logger is a org.apache.log4j.Logger
}
}
Nur protoObjX oder protoObjY wird gedruckt. Niemals beides. Warum passiert das?
Wenn ich logger.info(map.values());
statt für jeweils eine tun, dann funktioniert es. Wenn ein POJO anstelle von Proto obj verwendet wird, funktioniert es.
Welche Implementierung einer Karte verwenden Sie? Es kann fehlerhaft sein. –