登陆注册
8183300000055

第55章 6 单体对象的同步(单体模式与多线程)

大B:“在多线程模式下,惰性初始化会使多个线程同时初始化该单体,造成一个JVM中多个单例类型的实例,如果这个单例类型的成员变量在运行过程中发生变化,会造成多个单例类型实例的不一致。”

小A:“那应该怎么办?”

大B:“加个同步修饰符:public static synchronized Singleton getInstance()。这样就保证了线程的安全性。这种处理方式虽然引入了同步代码,但是因为这段同步代码只会在最开始的时候执行一次或多次,所以对整个系统的性能不会有影响。”

小A:“在更新属性的时候,会造成属性的读写不一致。那应该怎么处理?”

大B:“1、读者/写者的处理方式。设置一个读计数器,每次读取信息前,将计数器加1,读完后将计数器减1.使用notifyAll()解除在该对象上调用wait的线程阻塞状态。只有在读计数器为0时,才能更新数据,同时调用wait()方法要阻塞所有读属性的调用。2、采用‘影子实例’的办法。具体说,就是在更新属性时,直接生成另一个单例对象实例,这个新生成的单例对象实例将从数据库,文件或程序中读取最新的信息;然后将这些信息直接赋值给旧单例对象的属性。”

小A:“嘿嘿!师兄,能不能举例来看一下啊?”

大B:“好的。”

例子:

public class GlobalConfig{

private static GlobalConfig instance;

private Vector properties=null;

private boolean isUpdating=false;

private int readCount=0;

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 synchronized void update(String pdata){

syncUpdateIn();

//Update properties

}

private synchronized void syncUpdateIn(){

while(readCount>0){

try{

wait();

}catch(Exception e){

}

}

}

private synchronized void syncReadIn(){

readCount ;

}

private synchronized void syncReadOut(){

readCount――;

notifyAll();

}

public Vector getProperties(){

syncReadIn();

//Process data

syncReadOut();

return properties;

}

}

public class GlobalConfig{

private static GlobalConfig instance;

private Vector properties=null;

private boolean isUpdating=false;

private int readCount=0;

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 synchronized void update(String pdata){

syncUpdateIn();

//Update properties

}

private synchronized void syncUpdateIn(){

while(readCount>0){

try{

wait();

}catch(Exception e){

}

}

}

private synchronized void syncReadIn(){

readCount ;

}

private synchronized void syncReadOut(){

readCount――;

notifyAll();

}

public Vector getProperties(){

syncReadIn();

//Process data

syncReadOut();

return properties;

}

}

同类推荐
  • 中国网络传播研究2009(第三辑)

    中国网络传播研究2009(第三辑)

    本文以传统社区研究的“场域论”为基础,探讨网络传播中场域性互动对社会舆论的影响。文章首先从传统社区传播的场域性特征出发,探讨网络传播的社区性和场域性。然后分别分析了传统门户、BBS论坛和私人博客等三种主流的网络传播的场域性互动、意见表达和舆论形成的特点。最后结合“张殊凡事件”、“王石捐款”事件以及“黑砖窑”事件,探讨网络传播中的场域性互动对社会舆论从虚拟到现实的影响。
  • 信息技术教育大全-操作系统大全

    信息技术教育大全-操作系统大全

    本书系统介绍说明了有关电子信息系统及操作系统等知识,希望对该信息技术有需求的读者能够从中得到帮助。
  • 计算机应用基础案例教程

    计算机应用基础案例教程

    本书是根据教育部对高等院校计算机公共基础课程的基本要求,结合计算机技术的最新发展及高职高专类院校计算机基础课程改革的最新动向编写而成。其主要内容包括计算机基础知识、WindowsXP操作系统、Word2003文字处理软件、Excel2003电子表格软件、PowerPoint2003演示文稿制作软件、计算机网络与安全及常用工具软件的使用。本书将理论知识与项目实践相结合,既对理论有较为系统全面的讲解,又通过案例突出了操作技能的培养。本书内容新颖,体系结构合理,可作为高职高专学校、成人高等学校的计算机公共基础课教材,也可以作为广大计算机爱好者的自学参考书。
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
热门推荐
  • 步步倾心

    步步倾心

    她本是舞娘之女,仅凭在花园中与太子的不期而遇,便开启了转运之路。她攀附太后,巧妙献舞,勾结使臣,卷入两国的明争暗斗,后宫纷争中。当太子发现异常,狠狠地将她按在床边,强有力的撤掉她的衣衫时,她冷笑道:你自当我是你的棋子,可你何尝不是本宫的棋子?
  • 星夜传说之巅峰王者

    星夜传说之巅峰王者

    他们是一群原本生活快乐的人群从来没有对生活失去过信心亦无对未来的道路产生过迷茫却有人在没有经过他们的同意下,把他们从各自的世界中集合到这个神秘的空间,将他们抛入一个又一个世界里面,经历不同的世界,不同的事件,不同的文明,他们所需要做得就是完成它交代的任务在这里,不能变强,就要死亡
  • 炭烧三国

    炭烧三国

    回到东汉末年,突然发现自己携带了一间炭烧屋。在烤干历史水分,加上各种调味料之前,他已经被架在了现实的大火炉上。是灰飞烟灭还是百炼成金?在线等!各路救援,急急急!
  • 无毒不妃

    无毒不妃

    一位是被迷晕抬上花轿送入皇宫给年轻病帝冲喜的代嫁皇妃;一位是当朝执政三年的风云人物摄政王。堂堂法医,身中下三滥媚药,被堂妹陷害欲毁清白;十六岁的身子里包容着一颗三十岁的心,她早已过了矫情的心理年龄;她成为冷宫弃妃。于是她重拾身家本事,医术了得、断案无双,重获自由,努力地朝他靠近。原以为她付出得够多,两颗心就贴得够近,到最后她才发现,他对她所有的好,都带着目的……一代医妃,三出三嫁,最终能否获得良人归?【情节虚构,请勿模仿】
  • 末世中的英雄联盟

    末世中的英雄联盟

    其他人都是极其七颗龙珠来召唤神龙,而我,就是不一样。当游戏和末世联系在一起,不得了啦,集齐英雄,还会获得相应的奖励哦!
  • 人一生要读的100篇散文 人一生要读的100首诗歌 人一生要读的100本书 大全集

    人一生要读的100篇散文 人一生要读的100首诗歌 人一生要读的100本书 大全集

    读书可以经世致用,也可以修身怡心。生命的质量需要锻铸,阅读是锻铸的重要一环。阅读的广度,改变生命历程的长短;阅读的深度,决定思想境界的高低。正如“读一部好书,就是和许多高尚的人谈话”一样,读名家名作就是和大师的心灵在晤谈。一个人在其一生中,阅读一些立意深远、具有丰富思想内涵的作品,不仅可以开阔视野,重新认识历史、社会、人生和自然,获得思想上的盎然新意和艺术熏陶,而且还可以学习中外名家高超而成熟的创作技巧。
  • 财聚宝盆

    财聚宝盆

    商人不事生产?那就做个第一产业的商人!商人唯利是图?那就多做做慈善,让大家都有饱饭吃。商人格局太小?那就让商业走向世界。商人不好看?种田养身,霸道总裁,美女如云,征战天下,商行海外,你想要的元素都有了。且看一个魂穿到元末明初巨商沈万三身上的废材大学生,如何财聚宝盆,纵横天下。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 完美绅士之绝密任务

    完美绅士之绝密任务

    林峰,国内顶尖特工,因一项绝密任务成为一名千金大小姐张云曦的保镖。从此告别熟悉的丛林,那枪林弹雨的特工世界,回到都市之中。本以为生活会就此平静,谁知就在他一脚踏入校园之后,一件件事却不断袭来,搞得林峰头大不已。神秘的紫衣少女安琪岚,善良单纯的冯梦婷,头脑简单却开朗勇敢的张云曦、刁蛮任性的韩雨希,成熟知性的老师李云舒。随着事件的深入,各方势力、神秘组织接连出现,林峰的身世也缓缓展开,渐渐交织成一张繁复的大网。而所有事件的中心点,一项起源于上个世纪初的庞大计划,正似一头庞大的黑暗巨兽,冲着林峰,缓缓露出了狰狞的獠牙。