В следующем коде я пытаюсь напечатать имя потока и значение хэш-кода объекта vector
, но результат не соответствует ожидаемому. Кроме того, singleton поврежден, поскольку значения хеш-кода не соответствуют объекту vector
.Синхронизация не работает для данного примера кода
public class ThreadTestVector implements Runnable {
private static Vector<String> vector;
public static synchronized Vector<String> getInstance() {
if (vector == null) {
vector = new Vector<String>();
}
return vector;
}
@Override
public synchronized void run() {
Vector<String> vector = getInstance();
for (int i = 0; i < 10; i++) {
vector.add(Thread.currentThread().getName());
}
for (int i = 0; i < vector.size(); i++) {
System.out.println(vector.get(i) + " Hash Code "
+ vector.hashCode());
}
// clear the vector for values already printed
vector.clear();
}
public static void main(String[] args) throws Exception {
Runnable r = new ThreadTestVector();
Runnable r1 = new ThreadTestVector();
Runnable r2 = new ThreadTestVector();
Runnable r3 = new ThreadTestVector();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r1);
Thread t3 = new Thread(r2);
Thread t4 = new Thread(r3);
t1.start();
// Thread.sleep(100);
t2.start();
// Thread.sleep(100);
t3.start();
// Thread.sleep(100);
t4.start();
}
}
На выполнение следующих выходных шаблона производится
резьбы 0 Hash код 924221025
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
резьбовых 0 Hash код -119973247
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-1 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
резьбы 2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-2 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Thread-3 Hash код 1030242113
Резьбонарезной 0 Hash код 1901327073
Резьбонарезной 0 Hash код 1030242113
Резьбонарезной 0 Hash код 1030242113
Что все перепутано, а значения хэш-кода также различны.
Как исправить это так, что вывод печатается синхронизированным образом, а значения хеш-кода согласованы?
спасибо! Это устраняет проблему. Не могли бы вы объяснить, почему синхронизация метода run не помогла? – Nishant
вы должны синхронизировать объект, к которому одновременно будет обращаться другой поток. В противном случае вы не сможете его защитить – yushulx