ITPub博客

首页 > 应用开发 > Java > 单例模式

单例模式

原创 Java 作者:壹頁書 时间:2013-11-25 23:35:29 2 删除 编辑
单例模式,线程安全的三种方式
1.JVM保证线程安全

  1. public class Singleton {
  2.     public Singleton() {
  3.         System.out.println("Singleton init..");
  4.     }

  5.     //JVM保证多线程的安全性
  6.     private static Singleton obj = new Singleton();

  7.     public static Singleton getInstance() {
  8.         return obj;
  9.     }

  10.     public static void main(String[] args) {
  11.         for (int i = 0; i < 100; i++) {
  12.             new Thread(new Runnable() {

  13.                 @Override
  14.                 public void run() {
  15.                     Singleton.getInstance();
  16.                 }
  17.             }).start();
  18.         }
  19.     }
  20. }
2.使用同步块,延迟加载
    优点:初始化的时候并不创建对象,可以延迟加载
    缺点:以串行化的方式得到实例,运行效率比较低.

  1. public class Singleton {
  2.     public Singleton() {
  3.         System.out.println(\"Singleton init..\");
  4.     }

  5.     // 延迟加载
  6.     private static Singleton obj;

  7.     public static Singleton getInstance() {
  8.         synchronized (Singleton.class) {
  9.             if (obj == null) {
  10.                 obj = new Singleton();
  11.             }
  12.             return obj;
  13.         }
  14.     }

  15.     public static void main(String[] args) {
  16.         for (int i = 0; i < 100; i++) {
  17.             new Thread(new Runnable() {

  18.                 @Override
  19.                 public void run() {
  20.                     Singleton.getInstance();
  21.                 }
  22.             }).start();
  23.         }
  24.     }
  25. }

3.双重检查

  1. public class Singleton {
  2.     public Singleton() {
  3.         System.out.println(\"Singleton init..\");
  4.     }

  5.     // 延迟加载
  6.     private static Singleton obj;

  7.     public static Singleton getInstance() {
  8.         //一次检查
  9.         if (obj == null) {
  10.             synchronized (Singleton.class) {
  11.                 //二次检查
  12.                 if (obj == null) {
  13.                     obj = new Singleton();
  14.                 }
  15.             }
  16.         }
  17.         return obj;
  18.     }

  19.     public static void main(String[] args) {
  20.         for (int i = 0; i < 100; i++) {
  21.             new Thread(new Runnable() {

  22.                 @Override
  23.                 public void run() {
  24.                     Singleton.getInstance();
  25.                 }
  26.             }).start();
  27.         }
  28.     }
  29. }
4.静态内部类实现延迟加载

public class Singleton {
    private static class SingletonHandler {
        private static Singleton obj = new Singleton();
    }

    public static Object getInstance() {
        return SingletonHandler.obj;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Singleton.getInstance();
                }
            }).start();
        }
    }
}




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1061081/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: JSONP的例子
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339837