搬以前写的博客【2014-12-30 16:04】

在web应用中服务器面临的是大量的访问请求,免不了多线程程序,但是有时候,我们希望在多线程应用中的某一个类只能新建一个对象的时候,就会遇到问题。

首先考虑单线程,如果要求只能新建一个对象,那么构造函数我们要设为private。简单的想法:
class singleton{
  private singleton(){
    //.....
  }
  private static singleton instance;
  public static singleton getinstance(){
    if(instance==null) //
    instance = new singleton(); //
    return instance
  }
}
这对于单线程是合理的,第一次调用singleton类时,会新建出singleton对象,但之后访问时,返回的是第一次新建的instance。
但多线程访问时,有可能同时进入//1处的条件判断,多次执行2代码,从而新建多个singleton对象。我们考虑使用同步关键字sycronized
class singleton{
  private singleton(){
    //.....
  }
  private static singleton instance;
  public static singleton synchronized getinstance(){
    if(instance==null) //
      instance = new singleton(); //
    return instance
  }
}
此时可以保证不出错,是单例模式的一种方案,但是问题是每次执行都要用到同步,开销较大。
另外一种想法是,双重检查锁,代码如下:
class singleton{
  private singleton(){
    //.....
  }
  private static singleton instance;
  public static singleton getinstance(){
    if(instance==null) { //
      sycronized(singleton.class){
        if(instance==null)
          instance = new singleton(); //
      }
    }
    return instance;
  }
}
此写法保证了,当多个进程进入第一个判断锁时,会被同步机制隔离,只有一个程序进入新建对象,再其他线程进入时,instance已经不为null,因此不会新建多个对象。这种方法就叫做双重检查锁,但是也有一个问题,就是java是实行无序写入的机制,在某个线程执行//2代码的过程中,instance被赋予了地址,但是singleton对象还没构造完成时,如果有线程访问了代码//1此时判断instance不为空,但是方法返回的是一个不完整对象的引用。此时可能会产生错误!
另外一种实现单例模式的写法就是
class singleton{
  private singleton(){
    //.....
  }
  private static singleton instance = new singleton();
  public static singleton getinstance(){
    return instance;
  }
}
这样就不会有之前的问题了。

最新文章

  1. node03-events
  2. 【linux】之虚拟机的使用
  3. 类似桌面背景壁纸随手指滑动--第三方开源--BackgroundViewPager
  4. 排序算法 Java实现版
  5. Chrome浏览器查看cookie
  6. 《转》读discuzx3.1 数据库层笔记
  7. 在一个数组中是否存在两个数A、B的和为M
  8. Python标准库:内置函数repr(object)
  9. git笔记--git@OSC
  10. Spring mvc中junit测试遇到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException错误怎么解决
  11. appscan使用教程(全)
  12. python中print和input的底层实现
  13. create-react-app入门教程
  14. linux配置防火墙和重启防火墙
  15. 新书预告 ArcGIS跨平台开发系列第一本
  16. IO流程及优化
  17. 利用SynchronizationContext.Current在线程间同步上下文
  18. Canvas 绘制矩形,圆形,不规则图形(线条),渐变等图像效果
  19. 五:SpringCloud-Zuul
  20. 转:一步一步学ROP之linux_x86篇 - 蒸米

热门文章

  1. Oracle--SQL程序优化案例一
  2. 大数据笔记(二十)——NoSQL数据库之MemCached
  3. 熟练使用jquery ui / easyui的各种组件设计网页界面
  4. Node - 模块加载与 lerna 提升
  5. All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
  6. 20160711--C# 委托的三种调用示例(同步调用 异步调用 异步回调)【转载】
  7. iView 实战系列教程(21课时)_2.iView 实战教程之导航、路由、鉴权篇
  8. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_15-ArrayList集合存储基本数据
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_1_线程安全问题的概述
  10. Git 实践