- /*
- * 单例设计模式-饿汉式和饱汉式直例设计模式
- */
- 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;
- }
复制代码 所以结论是若使用直例设计模式使用饿汉式直例设计模式 |
|