Java

本类阅读TOP10

·使用MyEclipse开发Struts框架的Hello World!(录像1)
·hibernate配置笔记
·AOP编程入门--Java篇
·linux下Tomcat 5.0.20 与 Apache 2 安装/集成/配置
·在win2003下整合了整合Tomcat5.5+ apache_2.0.53+ mod_jk_2.0.47.dll
·构建Linux下IDE环境--Eclipse篇
·Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)
·ASP、JSP、PHP 三种技术比较
·Tomcat5.5.9的安装配置
·AWT GUI 设计笔记(二)

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
用两个锁解决单例模式的同步

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

public class Singleton {

  private static Singleton instance = null;

  static int i = 0;
  //建实例锁 锁命令: i++ ,所有线程都可以开锁就是: i-- 命令,
  //开锁的可能需要重新锁上。只有有资格建立实例的不用重新锁,有资格建立实例的条件时第一个开锁
 
  static int j = 0;
  //监视器  当多个实例开锁时监视是否有最先开锁的

  public static Singleton getInstance() {

    if (instance == null && i == 0) {
      //如果没有实例,并且线程被锁(就是没线程可以最先开锁)

      i++;
      //进门就关门
      j++;
      //开始监视


      //“开锁-重锁” 循环过程。 最先开锁的线程可以不重锁以建实例
      while (i == j) {
        //循环 如果没有一个线程能最先开锁
        //则此次过程失败,循环下去.

        i--; //开锁

        if (j == i + 1) {
          //本线程最先开锁,可以不重锁
          instance = new Singleton();
          //建实例,不重锁
        }
        else {
          //不是第一个开锁的,可能和其线程一起开锁,也可能落后其他线程

          i++;
          //重锁

        }
      }
    }

    while (instance == null) {
      //已经有线程最先开锁 只是没建完实例。等待
      try {
        Thread.sleep(1);
      }
      catch (InterruptedException ex) {

      }
    }

    return instance;

  }
}




相关文章

相关软件