2013-10-24 5 views
2

В следующем коде я пытаюсь напечатать имя потока и значение хэш-кода объекта 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

Что все перепутано, а значения хэш-кода также различны.

Как исправить это так, что вывод печатается синхронизированным образом, а значения хеш-кода согласованы?

ответ

1

Вы должны синхронизировать Вектор

if (vector != null) { 
synchronized(vector) { 
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(); 
} 
} 
+0

спасибо! Это устраняет проблему. Не могли бы вы объяснить, почему синхронизация метода run не помогла? – Nishant

+1

вы должны синхронизировать объект, к которому одновременно будет обращаться другой поток. В противном случае вы не сможете его защитить – yushulx

1

значения хэш-кода различаются, потому что хэш-код векторною вычислен из его содержания.

Так что неудивительно, что вы получаете разные значения для своего хэш-кода.

Смежные вопросы