黑马程序员技术交流社区
标题:
直例设计模式内关于线程安全的代码
[打印本页]
作者:
小马范
时间:
2014-12-9 22:51
标题:
直例设计模式内关于线程安全的代码
/*
* 单例设计模式-饿汉式和饱汉式直例设计模式
*/
public class SingleDemo {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//饿汉式直例设计模式,该模式不存在线程安全问题
/*private SingleDemo() {};
private final static SingleDemo s = new SingleDemo();
public static SingleDemo getSingle() {
return s;
}*/
//饱汉式直例设计模式
private SingleDemo(){};
private static SingleDemo s = null;
public static synchronized SingleDemo getSingle(){
if(s==null){
// 若多线程时同时有多个运行到该位置,会存在线程安全问题,所以在方法上增加同步锁
s = new SingleDemo();
}
return s;
}
public void printInf() {
System.out.println("The name is" + name);
}
public static void main(String[] args) {
SingleDemo sd1 = SingleDemo.getSingle();
sd1.setName("线程一");
SingleDemo sd2 = SingleDemo.getSingle();
sd2.setName("线程二");
//无论如何打印得到的结果都是一个name值。
sd1.printInf();
sd2.printInf();
}
}
复制代码
若多个线程都需要使用 getSingle()方法时,都会等待锁,会存在效率问题,优化后的代码如下:
注:只有修改后的代码,其他代码不变
//饱汉式优化后的直例设计模式
private SingleDemo(){};
private static SingleDemo s = null;
public static SingleDemo getSingle(){
//双重判断的形式解决效率问题
if(s==null){
//由于是静态方法内的锁,所以锁对象是SingleDemo.class
synchronized(SingleDemo.class){
if(s==null){
// 若多线程时同时有多个运行到该位置,会存在线程安全问题,所以在方法上增加同步锁
s = new SingleDemo();
}
}
}
return s;
}
复制代码
所以结论是若使用直例设计模式使用饿汉式直例设计模式
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2