黑马程序员技术交流社区

标题: 直例设计模式内关于线程安全的代码 [打印本页]

作者: 小马范    时间: 2014-12-9 22:51
标题: 直例设计模式内关于线程安全的代码
  1. /*
  2. * 单例设计模式-饿汉式和饱汉式直例设计模式
  3. */

  4. public class SingleDemo {
  5.         String name;

  6.         public String getName() {
  7.                 return name;
  8.         }

  9.         public void setName(String name) {
  10.                 this.name = name;
  11.         }
  12.    //饿汉式直例设计模式,该模式不存在线程安全问题
  13.         /*private SingleDemo() {};
  14.         private final static SingleDemo s = new SingleDemo();
  15.         public static SingleDemo getSingle() {
  16.                 return s;
  17.         }*/
  18.         
  19.         //饱汉式直例设计模式
  20.         private SingleDemo(){};
  21.         private static SingleDemo s = null;
  22.         public static synchronized SingleDemo getSingle(){
  23.                 if(s==null){
  24.                         // 若多线程时同时有多个运行到该位置,会存在线程安全问题,所以在方法上增加同步锁
  25.                         s = new SingleDemo();
  26.                 }
  27.                 return s;
  28.         }
  29.         
  30.         public void printInf() {
  31.                 System.out.println("The name is" + name);
  32.         }

  33.         public static void main(String[] args) {
  34.                 SingleDemo sd1 = SingleDemo.getSingle();
  35.                 sd1.setName("线程一");

  36.                 SingleDemo sd2 = SingleDemo.getSingle();
  37.                 sd2.setName("线程二");
  38.                 //无论如何打印得到的结果都是一个name值。
  39.                 sd1.printInf();
  40.                 sd2.printInf();
  41.         }
  42. }
复制代码
若多个线程都需要使用 getSingle()方法时,都会等待锁,会存在效率问题,优化后的代码如下:
注:只有修改后的代码,其他代码不变
  1.         //饱汉式优化后的直例设计模式
  2.         private SingleDemo(){};
  3.         private static SingleDemo s = null;
  4.         public static  SingleDemo getSingle(){
  5.                 //双重判断的形式解决效率问题
  6.                 if(s==null){
  7.                         //由于是静态方法内的锁,所以锁对象是SingleDemo.class
  8.                         synchronized(SingleDemo.class){
  9.                                 if(s==null){
  10.                                         // 若多线程时同时有多个运行到该位置,会存在线程安全问题,所以在方法上增加同步锁
  11.                                         s = new SingleDemo();
  12.                                 }
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
复制代码
所以结论是若使用直例设计模式使用饿汉式直例设计模式




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2