单实例的写法最保险的写法应采用静态方式的预生成  ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也需要考证是否解决了这个问题

推荐写法案例一

/*以单例模式启动*/
    private PendingJobPool() {}
    
    private static class JobPoolHolder{
        public static PendingJobPool pool = new PendingJobPool();
    }
    
    public static PendingJobPool getInstance() {
        return JobPoolHolder.pool;
    }

推荐的写法    清单10

class Singleton
{
  private Vector v;
  private boolean inUse;
  private static Singleton instance = new Singleton();

private Singleton()
  {
    v = new Vector();
    inUse = true;
    //...
  }

public static Singleton getInstance()
  {
    return instance;
  }
}

清单 10 的代码也没有使用同步如果您的目标是消除同步,则这将是一个很好的选择。

方法二

貌似现在可以用volatile了。 因为java的内存模式也在改进中。Doug Lea 在他的文章中写道:“根据最新的 JSR133 的 Java 内存模型,如果将引用类型声明为 volatile,双重检查模式就可以工作了”,参见 http://gee.cs.oswego.edu/dl/cpj/updates.html

实际分析如下也不可以,既使加了volatile,在堆上new对象时候,同样存在重排序的情况,(MARK老师,enjoyedu .Lesson14)

所以下面的说法也是待考证的,不可以轻信

lz提到的双重检测的问题是因为instruction reorder的关系导致在//3时: instance=new Singleton (); 这句假设分为三步 1.先申请内存 2.构造Singleton 3.将instance指向新的内存区域 如果不进行指令重排,这个是没问题的. 如果指令重排后执行顺序是. 1 3 2. 这就导致执行3后,instance已经非null, 此时若恰好有别的线程重新访问get_instance函数.将得到instance非null的结果,并此时返回一个 还没执行完构造函数的instance实例.从而出错. 但是volatile关键字的第二个语义,便是‘禁止指令重排优化’. 因此,如果把instance变量声明为 volatile , 双重检测法似乎也是work的. 如下:

private static volatile Singleton instance;

public static Singleton getInstance()

{ if (instance == null) {

synchronized(Singleton.class) { //1

if (instance == null) //2

instance = new Singleton(); //3

}

}

return instance;

}

原文链接:https://blog.csdn.net/chenchaofuck1/article/details/51702129

单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也要谨慎,需要考证是否解决这个问题相关推荐

  1. Oracle 运维篇+RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要

    说明:本文为Oracle RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要方便用户查阅 温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化 说 ...

  2. mysql 单实例部署_Mysql 数据库单机多实例部署手记

    最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式. 找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运 ...

  3. servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变

    Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...

  4. Singleton、MultiThread、Lib——实现单实例无锁多线程安全API

        前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...

  5. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  6. 正式生产库,配置双节点的RAC + 单实例的 DATAGUARD

    正式生产库,配置DATAGUARD RAC+单实例DATAGUARD  配置 RAC 两节点: 192.1.0.101    rac1     192.1.0.102    rac2 存储:ASM D ...

  7. RAC (双节点) + 单实例 DATAGUARD 安装遇到的问题处理

    RAC (双节点) + 单实例 DATAGUARD 安装遇到的问题处理 PRIMARY:  RAC 双节点 ,存储:ASM STANDBY: 单实例          存储: ASM 单实例  数据库 ...

  8. servlet单实例多线程模式

    Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在 ...

  9. linux下程序如何实现单实例运行

    1.技术原理 无论是windows还是linux下,程序设计者都会遇到一个问题,那就是如何实现程序的单实例运行.比如,Windows自带的播放软件Windows Medea Player只能启动一个实 ...

最新文章

  1. gulp项目配置指南
  2. 陕西省铜川市计算机学校,铜川市计算机专业学校怎么样?好不好?
  3. element显示true或者false_element-ui轮播的简单实现
  4. 他爬取了B站所有番剧信息,发现了这些……
  5. Change Jenkins time zone
  6. centos locale报错问题
  7. New Relic性能监控(三)浏览器端监控
  8. c语言对c99标准声明,C语言三大标准C89,C99和C11
  9. 微众银行--java面试题一
  10. Ipad mini2、苹果5s降级10.3.3教程
  11. 域名系统的主要功能是什么?域名系统中的根服务器和权威服务器有何区别?权威服务器与管辖区有何关系?
  12. 家庭局域网网站服务器,1000元打造家庭局域网
  13. 安卓期末大作业——猫咪社区(源码+任务书)
  14. python quit函数作用_初识Python之基础知识
  15. 新海诚没有参与制作的作品_下面哪部作品新海诚没有参与制作
  16. 如何从一个虚拟主机迁移数据到另一个虚拟主机
  17. Git泄露之Index
  18. xml层级工具_XML Tree
  19. 唯一摩尔斯密码词 leetcode Java篇
  20. Line-based Automatic Extrinsic Calibration of LiDAR and Camera论文阅读

热门文章

  1. oracle log block size,案例:Oracle无法启动报错ORA-00218: block size 0 重建控制文件
  2. linux密码加密文件,Linux下加密/解密及用密码保护文件的七把利器
  3. java myeclipse 下载_myeclipse 10|MyEclipse(优秀的Java开发工具myeclipse下载) 10.7官方版下载 - 下载吧...
  4. 32linux下安装mysql5.7_【Linux】【MySQL】安装MySQL,版本5.7
  5. sar极化想干矩阵_用于PolSAR图像分类的极化卷积网络
  6. linux fls函数,linux常用操作命令
  7. mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询
  8. android md日期选择器,移动端日期选择
  9. 安卓读取mysql数据库文件路径_Android开发实现读取assets目录下db文件的方法示例...
  10. qt 一定要指定大小吗 数组_Qt中数组的初始化 | 学步园