在 Java 中使用单例的最佳方式
best way to use a Singleton in Java
假设我们在 Java 中有一个线程安全的单例 class,这将是最好或更好的使用方式。例如,假设我们有一个单例 class 为:
public class MySingleTon {
// my thread-safe code goes here
}
并且我们有一个服务 class 以如下两种可能的方式使用上述单例:
1:
public class MyService {
MySingleton singleton;
public void myMethod1() {
singleton = MySingleton.getInstance();
// code ...
}
public void myMethod2() {
singleton = MySingleton.getInstance();
// code...
}
public void myMethod3() {
singleton = MySingleton.getInstance();
// code...
}
}
或
2:
public class MyService {
public void myMethod1() {
MySingleton singleton = MySingleton.getInstance();
// code ...
}
public void myMethod2() {
MySingleton singleton = MySingleton.getInstance();
// code...
}
public void myMethod3() {
MySingleton singleton = MySingleton.getInstance();
// code...
}
}
在第一种情况下,单例是通过实例变量引用的,而在第二种情况下,单例是作为方法局部变量引用的。考虑到以上两个片段都用于多线程环境,这是一个更好的选择,为什么?
我会用第三种方式定义它
public class MyService {
final static MySingleton singleton = MySingleton.getInstance();
public void myMethod1() {
// code ...
}
public void myMethod2() {
// code...
}
public void myMethod3() {
// code...
}
}
在所有情况下,线程安全性都没有区别
2 在我看来会更好。它给予 MySingleton
杀死单例实例并在需要时重新创建的自由(即,自我检测死锁或资源争用缓解)。
假设我们在 Java 中有一个线程安全的单例 class,这将是最好或更好的使用方式。例如,假设我们有一个单例 class 为:
public class MySingleTon {
// my thread-safe code goes here
}
并且我们有一个服务 class 以如下两种可能的方式使用上述单例:
1:
public class MyService {
MySingleton singleton;
public void myMethod1() {
singleton = MySingleton.getInstance();
// code ...
}
public void myMethod2() {
singleton = MySingleton.getInstance();
// code...
}
public void myMethod3() {
singleton = MySingleton.getInstance();
// code...
}
}
或
2:
public class MyService {
public void myMethod1() {
MySingleton singleton = MySingleton.getInstance();
// code ...
}
public void myMethod2() {
MySingleton singleton = MySingleton.getInstance();
// code...
}
public void myMethod3() {
MySingleton singleton = MySingleton.getInstance();
// code...
}
}
在第一种情况下,单例是通过实例变量引用的,而在第二种情况下,单例是作为方法局部变量引用的。考虑到以上两个片段都用于多线程环境,这是一个更好的选择,为什么?
我会用第三种方式定义它
public class MyService {
final static MySingleton singleton = MySingleton.getInstance();
public void myMethod1() {
// code ...
}
public void myMethod2() {
// code...
}
public void myMethod3() {
// code...
}
}
在所有情况下,线程安全性都没有区别
2 在我看来会更好。它给予 MySingleton
杀死单例实例并在需要时重新创建的自由(即,自我检测死锁或资源争用缓解)。