在单例模式中,当两个或多个线程同时执行时会发生什么?
In Singleton Pattern,what happen when a two or more threads execute same time?
在下面,我试图在单例模式中发送两个线程,看看这两个线程在没有 synchronizing.In 的情况下如何工作理论上两个线程应该在没有同步的情况下使两个单独的 objects.But,只有一个对象正在创建并且两个线程的详细信息正在分配两个 object.I 当我打印 object.How 时可以看到它是 happening.why 不是有两个对象正在创建吗?
public class Singleton_Pattern {
public static void main(String[] args) {
Test1 t1=new Test1();
t1.start();
Test2 t2=new Test2();
t2.start();
t1.m();
t2.m();
}
}
class Test1 extends Thread {
void m() {
System.out.println(A.getA());
A.getA().setValue("Cat");
System.out.println(A.getA().getValue());
}
}
class Test2 extends Thread {
void m() {
System.out.println(A.getA());
A.getA().setValue("Dog");
System.out.println(A.getA().getValue());
}
}
class A {
private static A a;
String name;
private A() {
}
public static A getA() {
if (a == null) {
a = new A();
}
return a;
}
public void setValue(String t) {
name = t;
}
public String getValue() {
return name;
}
}
为什么您认为从不同的线程调用 getA()
应该创建不同的对象?一个应用程序只有一个 static
区域。所以在这种情况下,两个线程都应使用相同的对象。
在您的示例中,您使用主线程调用 m()
方法。您应该覆盖 run()
方法以有效地使用多线程。在你的 Test1
和 Test2
类.
中添加以下方法
public void run() {
m();
}
并从您的 main
方法中删除以下行,
t1.m();
t2.m();
您正在主线程上调用 m()
。要在单独的线程中调用它,您需要在线程 类 中覆盖 run()
方法并从 run()
.
中调用 m()
一旦你解决了这个问题,两个线程完全同时进入块的可能性很小,精确到纳秒。您 可以 尝试使用多个线程和 运行 循环来查看并发问题。但是因为 a
是静态的,所以 "new" 对象会很快覆盖旧实例。
查看 this answer 以了解单例模式中的同步。
在下面,我试图在单例模式中发送两个线程,看看这两个线程在没有 synchronizing.In 的情况下如何工作理论上两个线程应该在没有同步的情况下使两个单独的 objects.But,只有一个对象正在创建并且两个线程的详细信息正在分配两个 object.I 当我打印 object.How 时可以看到它是 happening.why 不是有两个对象正在创建吗?
public class Singleton_Pattern {
public static void main(String[] args) {
Test1 t1=new Test1();
t1.start();
Test2 t2=new Test2();
t2.start();
t1.m();
t2.m();
}
}
class Test1 extends Thread {
void m() {
System.out.println(A.getA());
A.getA().setValue("Cat");
System.out.println(A.getA().getValue());
}
}
class Test2 extends Thread {
void m() {
System.out.println(A.getA());
A.getA().setValue("Dog");
System.out.println(A.getA().getValue());
}
}
class A {
private static A a;
String name;
private A() {
}
public static A getA() {
if (a == null) {
a = new A();
}
return a;
}
public void setValue(String t) {
name = t;
}
public String getValue() {
return name;
}
}
为什么您认为从不同的线程调用 getA()
应该创建不同的对象?一个应用程序只有一个 static
区域。所以在这种情况下,两个线程都应使用相同的对象。
在您的示例中,您使用主线程调用 m()
方法。您应该覆盖 run()
方法以有效地使用多线程。在你的 Test1
和 Test2
类.
public void run() {
m();
}
并从您的 main
方法中删除以下行,
t1.m();
t2.m();
您正在主线程上调用 m()
。要在单独的线程中调用它,您需要在线程 类 中覆盖 run()
方法并从 run()
.
m()
一旦你解决了这个问题,两个线程完全同时进入块的可能性很小,精确到纳秒。您 可以 尝试使用多个线程和 运行 循环来查看并发问题。但是因为 a
是静态的,所以 "new" 对象会很快覆盖旧实例。
查看 this answer 以了解单例模式中的同步。