java - 使用同步或不低于为所有线程生成相同哈希码的代码。如何?
问题描述
“我们使全局访问方法同步,以便一次只有一个线程可以执行 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
不使用同步方法哈希码在所有线程情况下都是相同的,如何?
解决方案
如果我一次启动所有线程
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
无法理解这种行为
推荐阅读
- javascript - 如何在服务工作者(sw.js)文件中调用/导入/使用 Angular 服务(Typescript - myService.service.ts)?
- google-cloud-platform - 如何在 GCP 中限制用户使用 GPU 计数?
- laravel - 我的 laravel 查询没有给我我的数据并且得到这个页面不起作用
- aem - 从核心组件 (AEM) 扩展选项卡组件时出现持久性错误
- python - 如果满足某些条件,则比较整行是否相等
- html - 即使使用相同的 CSS,顶部和底部的网站导航栏也无法正常工作
- javascript - 不能在nodejs的客户端产生错误
- node.js - Next.js - getInitialProps 中的 axios 返回 404
- c# - windows7 c#如何识别物理和虚拟网络适配器
- php - CodeIgniter 4 只有默认路由 / 是可访问的,如果我在我的 Routes.php 中定义,则没有其他路由可用。我正在使用 ubuntu