首页 > 解决方案 > 使用同步或不低于为所有线程生成相同哈希码的代码。如何?

问题描述

“我们使全局访问方法同步,以便一次只有一个线程可以执行 getInstance 方法”,而无需在下面的代码中使用已像线程安全一样的 synchronized 关键字。

汽车.java

public class Car {

private static Car car;

private Car() {
    // TODO Auto-generated constructor stub
}

public static Car getInstance(){
    if(car==null){
        car=new Car();
    }
    return car;
}
}

测试.java

public class Test {
public static void main(String[] args) {
    Thread t1=new Thread(new Runnable() {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+" Running");
            System.out.println(Car.getInstance().hashCode());
            System.out.println(Thread.currentThread().getName()+" Finishing");
        }
    });
    t1.start();

    Thread t2=new Thread(new Runnable() {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+" Running");
            System.out.println(Car.getInstance().hashCode());
            System.out.println(Thread.currentThread().getName()+" Finishing");
        }
    });

    t2.start();

    Thread t3=new Thread(new Runnable() {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+" Running");
            System.out.println(Car.getInstance().hashCode());
            System.out.println(Thread.currentThread().getName()+" Finishing");
        }
    });
    t3.start();
    }
}

输出

Thread-0 Running
1828451009
Thread-0 Finishing
Thread-1 Running
1828451009
Thread-1 Finishing
Thread-2 Running
1828451009
Thread-2 Finishing

不使用同步方法哈希码在所有线程情况下都是相同的,如何?

标签: javamultithreadingthread-safetysingleton

解决方案


如果我一次启动所有线程

t1.start();
t2.start();
t3.start();

输出有时不同,有时相同的哈希码有时不同

Thread-1 Running
Thread-2 Running
Thread-0 Running
183297081
Thread-2 Finishing
183297081
Thread-1 Finishing
183297081
Thread-0 Finishing


Thread-0 Running
Thread-2 Running
Thread-1 Running
678111939
1828451009
1828451009
Thread-2 Finishing
Thread-1 Finishing
Thread-0 Finishing


Thread-0 Running
Thread-2 Running
Thread-1 Running
678111939
183297081
558529301
Thread-1 Finishing
Thread-2 Finishing
Thread-0 Finishing

无法理解这种行为


推荐阅读