package xk;
/**
*
* ClassName: Singleton
*
* @Description: TODO 单例模式(线程同步)
* @author xukun
* @date 2016年7月24日
*/
public class Singleton {
private static Singleton instance1;
private static volatile Singleton instance2;
private static volatile Singleton instance3;
public static Singleton getInstance1() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (null == instance1) {
instance1 = new Singleton();
System.out.print(1 + "-");
}
return instance1;
}
public static Singleton getInstance2() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (null == instance2) {
instance2 = new Singleton();
System.out.print(2 + "-");
}
return instance2;
}
public static Singleton getInstance3() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (null == instance3) {
synchronized (Singleton.class) {
if (instance3 == null) {
instance3 = new Singleton();
System.out.print(3 + "-");
}
}
}
return instance3;
}
/**
*
* @Description: TODO 主函数
* @param @param args
* @return void
* @throws
* @author xukun
* @date 2016年7月24日 上午10:06:30
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
Singleton.getInstance1();
Singleton.getInstance2();
Singleton.getInstance3();
}
}).start();
}
}
}
可以看出用volatile并不能保证线程安全。
Java单例模式-volatile与synchronized的使用
最新推荐文章于 2024-08-22 20:48:04 发布