美文网首页@IT·互联网程序员
单线程/多线程下的单例

单线程/多线程下的单例

作者: 小甜妮子__ | 来源:发表于2017-04-26 10:47 被阅读176次

1.一般的单例(单线程下的单例):
<pre>
/**

  • 单线程下单例--延迟实例化(lazy)
  • @author wangzhaoli

*/
public class SettingManager {
// 静态私有实例
private static SettingManager settingManager;
// 私有构造方法
private SettingManager(){

}
// 提供静态共有方法获取唯一实例
public static SettingManager getInstance(){
    if(settingManager == null){
        settingManager = new SettingManager();
    }
    return settingManager;
}

}
</pre>

2.多线程下使用上述的单例会有严重的问题,一下一一说明多线程下单例的使用方式
<pre>
/**

  • 多线程下单例1--synchronized
  • 优点:简单
  • 缺点:严重降低性能;且实际上只有首次实例化对象才需要synchronized
  • @author wangzhaoli

*/
public class SettingManager {
private static SettingManager settingManager;
private SettingManager(){

}
// synchronized的作用:每个线程在调用该方法之前要等待其他线程的退出
public static synchronized SettingManager getInstance(){
    if(settingManager == null){
        settingManager = new SettingManager();
    }
    return settingManager;
}

}
</pre>

<pre>
/**

  • 多线程下单例2--急切实例化(eagerly)
  • 优点:简单
  • 缺点:对于一次使用几率很小的单例,每次程序运行都启动,并存在整个应用生命周期,会造成不必要的资源浪费
  • @author wangzhaoli

*/
public class SettingManager {
private static SettingManager settingManager = new SettingManager();//在JVM类加载时就创建实例,此时任何线程未启动
private SettingManager(){

}
public static SettingManager getInstance(){
    return settingManager;
}

}
</pre>

<pre>
/**

  • 多线程下单例3--双重检查加锁(考虑性能的有效单例)
  • 优点:同样是使用synchronized,但是只有首次实例化的时候才会使用synchronized,一旦存在实例,不再使用synchronized,提高性能
  • 缺点:繁琐一点
  • @author wangzhaoli

*/
public class SettingManager {
// 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile只在JDK1.4及以后的版本可用
private volatile static SettingManager settingManager;
private SettingManager(){

}
public static SettingManager getInstance(){
    if(settingManager == null){
        // 保证synchronized只是用一次,保证了性能
        synchronized (SettingManager.class) {
            if(settingManager == null){
                settingManager = new SettingManager();
            }
        }
    }
    return settingManager;
}

}
</pre>

最后说明,区分类的单例和对象的单例:
类的单例--静态方法调用,适用于一些工具类,引用能够自给自足;
对象的单例--除了单例对象本身,其他的方法都是有单例对象调用,适用于依赖一些其他类的情况。

相关文章

  • iOS 三种单例创建方式的优缺点

    一、单线程模式单例 · 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意...

  • iOS 三种单例创建方式的优缺点

    一、单线程模式单例 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意义上...

  • OC 和 swift 创建单例方法

    OC单例 1.使用GCD(推荐使用) 2.单线程模式单例 此单例只有在单个线程使用的情况下实用,在多线程的情况下,...

  • 关于JAVA栈与堆的讨论

    今天晚上收获颇丰详细讨论了java的一些知识 引入点是 单例多线程 多例单线程 单例多线程: SpringMV...

  • 常用设计模式 单例模式-懒汉式

    懒汉单例 多线程情形 上面的程序使用单线程时不会有问题,但是使用多线程时会破坏单例。运行以下程序lazySingl...

  • iOS-单例的正确写法

    一、OC 中创建单例的几种方式 1.1 单线程模式单例 存在的问题就是: 只能在单线程中使用, 一旦有多线程同时调...

  • iOS-单例的几种写法

    一、静态指针方式(单线程模式单例) 二、多线程加锁单例 三、单例的健壮性 由于水平有限,难免出现纰漏,如有问题还请...

  • 单线程/多线程下的单例

    1.一般的单例(单线程下的单例): /** 单线程下单例--延迟实例化(lazy) @author wangzha...

  • 单例模式相关

    单线程的情况下不加volatile和synchronized也是正确的单例。多线程情况下,如果你把volatile...

  • 单例模式

    -------------------------------------------最简单的单线程下的单例模式-...

网友评论

    本文标题:单线程/多线程下的单例

    本文链接:https://www.haomeiwen.com/subject/rhcizttx.html