多线程下的单例设计模式
添加时间:2013-5-9 点击量:
众所周知,单例模式中,机关办法是私有化的,经由过程静态办法内部调用机关函数返回该类的实例对象。常见的代码如下所示:
public class Singleton {
private static Singleton singletonObj;
private Singleton(){}
public static Singleton getInstance(){
if(singletonObj == null){
singletonObj = new Singleton();
}
return singletonObj;
}
}
在单线程的景象下,确切可以包管只有一个实例,然则在多线程的景象下,就会产生意想不到的景象。
创建一个TestSingleton类,如下:
public class TestSingleton implements Runnable {
private Singleton s = null;
public Singleton getS() {
return s;
}
public void setS(Singleton s) {
this.s = s;
}
public static void main(String[] args) {
TestSingleton ts1 = new TestSingleton();
TestSingleton ts2 = new TestSingleton();
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.start();
t2.start();
Singleton s1 = ts1.getS();
Singleton s2 = ts2.getS();
System.out.println(s1 == s2);
}
@Override
public void run() {
s = Singleton.getInstance();
}
}
运行成果返回 false
在多线程的景象中须要推敲同步的题目,对上述单例模式的代码进行批改,如下:
public static Singleton getInstance() {
if (singletonObj == null) {
synchronized (Singleton.class) {
if (singletonObj == null) {
singletonObj = new Singleton();
}
}
}
return singletonObj;
}
从头运行上述TestSingleton ,返回成果 true 此时,包管即使是在多线程的景象下,依然可以或许对峙单例模式的正确性。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
众所周知,单例模式中,机关办法是私有化的,经由过程静态办法内部调用机关函数返回该类的实例对象。常见的代码如下所示:
public class Singleton {
private static Singleton singletonObj;
private Singleton(){}
public static Singleton getInstance(){
if(singletonObj == null){
singletonObj = new Singleton();
}
return singletonObj;
}
}
在单线程的景象下,确切可以包管只有一个实例,然则在多线程的景象下,就会产生意想不到的景象。
创建一个TestSingleton类,如下:
public class TestSingleton implements Runnable {
private Singleton s = null;
public Singleton getS() {
return s;
}
public void setS(Singleton s) {
this.s = s;
}
public static void main(String[] args) {
TestSingleton ts1 = new TestSingleton();
TestSingleton ts2 = new TestSingleton();
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.start();
t2.start();
Singleton s1 = ts1.getS();
Singleton s2 = ts2.getS();
System.out.println(s1 == s2);
}
@Override
public void run() {
s = Singleton.getInstance();
}
}
运行成果返回 false
在多线程的景象中须要推敲同步的题目,对上述单例模式的代码进行批改,如下:
public static Singleton getInstance() {
if (singletonObj == null) {
synchronized (Singleton.class) {
if (singletonObj == null) {
singletonObj = new Singleton();
}
}
}
return singletonObj;
}
从头运行上述TestSingleton ,返回成果 true 此时,包管即使是在多线程的景象下,依然可以或许对峙单例模式的正确性。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》