2013-10-24 6 views
2

다음 코드에서 스레드 이름과 vector 개체의 해시 코드 값을 인쇄하려고하지만 예상대로 출력되지 않았습니다. 또한, vector 객체에 대해 해시 코드 값이 일치하지 않으므로 싱글 톤이 손상됩니다.
스레드 0 해시 ​​코드 924,221,025
스레드 0 해시 ​​코드 1,030,242,113
스레드 0 해시 ​​코드 1,030,242,113
스레드 0 해시 ​​코드 1,030,242,113
스레드 - 생산되는 출력 패턴 다음 실행에서주어진 코드 예제에서 동기화가 작동하지 않습니다.

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 해시 코드 -119973247
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드 0 해시 ​​코드 1030242113
스레드-1 해시 코드 1030242113
스레드-1 해시 코드 1030242113
스레드-1 해시 코드 1030242113
스레드-1 해시 코드 1030242113
스레드-1 해시 코드 1,030,242,113 012,380,073,162 7,552,314,960,453,210 스레드 1 해시 코드 1,030,242,113
스레드 1 해시 코드 1,030,242,113
스레드 1 해시 코드 1,030,242,113
스레드 1 해시 코드 1,030,242,113
스레드 1 해시 코드 1,030,242,113
스레드 2 해시 코드 1,030,242,113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드 2 해시 코드 1030242113
스레드-3 해시 코드 1030242113
스레드-3 해시 코드 1030242113
스레드 3 해시 코드 1030242113
스레드-3 해시 코드 1030242113
스레드-3 해시 코드 1030242113
스레드-3 해시 코드 1030242113
스레드-3 해시 코드 1030242113,552,314,960,453,210 스레드 3 해시 코드 1,030,242,113
스레드 3 해시 코드 1,030,242,113
스레드 3 해시 코드 1,030,242,113
스레드 0 해시 ​​코드 1,901,327,073
스레드 0 해시 ​​코드 1,030,242,113
스레드 0 해시 ​​코드 1,030,242,113

모두 엉망이며 해시 코드 값도 다릅니다.

출력이 동기화 된 방식으로 인쇄되고 해시 코드 값이 일치하도록 수정하는 방법은 무엇입니까?벡터의 해시 코드는 그 내용에서 계산되기 때문에 벡터를

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(); 
} 
} 

답변

1

는 다르다.

따라서 해시 코드에 대한 값이 달라지는 것은 놀라운 일이 아닙니다.

+0

감사합니다. 문제를 해결합니다. 실행 방법을 동기화하는 것이 도움이되지 않는 이유를 설명해 주시겠습니까? – Nishant

+1

다른 스레드가 동시에 액세스 할 객체를 동기화해야합니다. 그렇지 않으면 보호 할 수 없습니다. – yushulx

1

해시 코드 값을 동기화해야

관련 문제