首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 多线程上的单例模式

2012-11-10 
Java 多线程下的单例模式转自:http://hi.baidu.com/gaoshigang/blog/item/8268182942227efa98250a37.html?

Java 多线程下的单例模式

转自:http://hi.baidu.com/gaoshigang/blog/item/8268182942227efa98250a37.html

?

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。
  本文将探讨一下在多线程环境下,使用单例对象作配置信息管理时可能会带来的几个同步问题,并针对每个问题给出可选的解决办法。
  问题描述
  在多线程环境下,单例对象的同步问题主要体现在两个方面,单例对象的初始化和单例对象的属性更新。
  本文描述的方法有如下假设:
  1. 单例对象的属性(或成员变量)的获取,是通过单例对象的初始化实现的。也就是说,在单例对象初始化时,会从文件或数据库中读取最新的配置信息。
  2. 其他对象不能直接改变单例对象的属性,单例对象属性的变化来源于配置文件或配置数据库数据的变化。
  1.1 单例对象的初始化
  首先,讨论一下单例对象的初始化同步。单例模式的通常处理方式是,在对象中有一个静态成员变量,其类型就是单例类型本身;如果该变量为null,则创建该单例类型的对象,并将该变量指向这个对象;如果该变量不为null,则直接使用该变量。
  其过程如下面代码所示:

public class GlobalConfig {    private static GlobalConfig instance = null;    private Vector properties = null;    private GlobalConfig() {      //Load configuration information from DB or file      //Set values for properties    }    private static synchronized void syncInit() {      if (instance = null) {        instance = new GlobalConfig();      }    }    public static GlobalConfig getInstance() {      if (instance = null) {        syncInit();      }      return instance;    }    public Vector getProperties() {      return properties;    }    public void updateProperties() {      //Load updated configuration information by new a GlobalConfig object      GlobalConfig shadow = new GlobalConfig();      properties = shadow.getProperties();    }  }

?注意:在更新方法中,通过生成新的GlobalConfig的实例,从文件或数据库中得到最新配置信息,并存放到properties属性中。

  上面两个方法比较起来,第二个方法更好,首先,编程更简单;其次,没有那么多的同步操作,对性能的影响也不大。

热点排行