单例模式,线程安全的三种方式
1.JVM保证线程安全
-
public class Singleton {
-
public Singleton() {
-
System.out.println("Singleton init..");
-
}
-
-
//JVM保证多线程的安全性
-
private static Singleton obj = new Singleton();
-
-
public static Singleton getInstance() {
-
return obj;
-
}
-
-
public static void main(String[] args) {
-
for (int i = 0; i < 100; i++) {
-
new Thread(new Runnable() {
-
-
@Override
-
public void run() {
-
Singleton.getInstance();
-
}
-
}).start();
-
}
-
}
-
}
2.使用同步块,延迟加载
优点:初始化的时候并不创建对象,可以延迟加载
缺点:以串行化的方式得到实例,运行效率比较低.
-
public class Singleton {
-
public Singleton() {
-
System.out.println(\"Singleton init..\");
-
}
-
-
// 延迟加载
-
private static Singleton obj;
-
-
public static Singleton getInstance() {
-
synchronized (Singleton.class) {
-
if (obj == null) {
-
obj = new Singleton();
-
}
-
return obj;
-
}
-
}
-
-
public static void main(String[] args) {
-
for (int i = 0; i < 100; i++) {
-
new Thread(new Runnable() {
-
-
@Override
-
public void run() {
-
Singleton.getInstance();
-
}
-
}).start();
-
}
-
}
-
}
3.双重检查
-
public class Singleton {
-
public Singleton() {
-
System.out.println(\"Singleton init..\");
-
}
-
-
// 延迟加载
-
private static Singleton obj;
-
-
public static Singleton getInstance() {
-
//一次检查
-
if (obj == null) {
-
synchronized (Singleton.class) {
-
//二次检查
-
if (obj == null) {
-
obj = new Singleton();
-
}
-
}
-
}
-
return obj;
-
}
-
-
public static void main(String[] args) {
-
for (int i = 0; i < 100; i++) {
-
new Thread(new Runnable() {
-
-
@Override
-
public void run() {
-
Singleton.getInstance();
-
}
-
}).start();
-
}
-
}
-
}
4.静态内部类实现延迟加载
public class Singleton {
private static class SingletonHandler {
private static Singleton obj = new Singleton();
}
public static Object getInstance() {
return SingletonHandler.obj;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Singleton.getInstance();
}
}).start();
}
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1061081/
,如需转载,请注明出处,否则将追究法律责任。