Java 同步不';对于给定的代码示例不起作用

Java 同步不';对于给定的代码示例不起作用,java,multithreading,synchronization,Java,Multithreading,Synchronization,在下面的代码中,我试图打印vector对象的线程名和哈希代码值,但输出结果与预期不符。此外,由于向量对象的散列码值不一致,因此单例被破坏 public class ThreadTestVector implements Runnable { private static Vector<String> vector; public static synchronized Vector<String> getInstance() { if (vector == n

在下面的代码中,我试图打印
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();

}

}
公共类ThreadTestVector实现可运行{
私有静态向量;
公共静态同步向量getInstance(){
如果(向量==null){
向量=新向量();
}
返回向量;
}
@凌驾
公共同步的无效运行(){
Vector=getInstance();
对于(int i=0;i<10;i++){
add(Thread.currentThread().getName());
}
对于(int i=0;i
执行时产生以下输出模式
线程0哈希代码924221025
线程0哈希代码1030242113
线程0哈希代码1030242113
线程0哈希代码1030242113
线程-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哈希代码1030242113
线程1哈希代码1030242113
线程1哈希代码1030242113
线程1哈希代码1030242113
线程1哈希代码1030242113
线程1哈希代码1030242113
线程2哈希代码1030242113
线程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
线程3哈希代码1030242113
线程3哈希代码1030242113
线程3哈希代码1030242113
线程0哈希代码1901327073
线程0哈希代码1030242113
线程0哈希代码1030242113

这一切都很混乱,散列码值也不同


如何修复它,以便以同步方式打印输出,并且哈希代码值保持一致?

您应该同步向量

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();
}
}
if(向量!=null){
同步(矢量){
对于(int i=0;i<10;i++){
add(Thread.currentThread().getName());
}
对于(int i=0;i
哈希代码值不同,因为向量的哈希代码是根据其内容计算的


因此,哈希代码的值不同也就不足为奇了。

谢谢!它确实解决了这个问题。请解释为什么同步run方法没有帮助?您应该同步将由不同线程同时访问的对象。否则,你就无法保护它