- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
同步块确保多线程正确处理uniqueInstance()变量.ppt
单件模式 * 下面的类能否实例化? public MyClass { private MyClass() {} // 构造方法是私有的。 } 创建MyClass对象需要调用它的构造方法,而它的构造方法是私有的!私有的方法只有类内的方法才能调用。 下面的方法是否可行? public MyClass { private MyClass ( ) {} public static MyClass getInstance( ) { return new MyClass( ); } // getInstance( )是静态方法。 } 经典单件模式的实现 public class Singleton { private static Singleton uniqueInstance; // 其它变量 private Singleton ( ) {} public static Singleton getInstance( ) { if (uniqueInstance == null) { uniqueInstance = new Singleton( ); } return uniqueInstance; } // 其它方法 } 如果uniqueInstance不是静态的,怎么样? 巧克力工厂 public class ChocolateBoiler { private boolean empty; private boolean boiled; public ChocolateBoiler() { empty = true; boiled = false; } public void fill() { if (isEmpty()) { empty = false; boiled = false; // 锅炉内填充巧克力和牛奶的混合物 } } 现代巧克力工厂具备计算机控制的锅炉。锅炉把巧克力和牛奶混合在一起,送入下一阶段,以制成巧克力棒。 巧克力工厂(续) public void drain() { if (!isEmpty() isBoiled()) { // 排出煮沸的牛奶和巧克力 empty = true; } } public void boil() { if (!isEmpty() !isBoiled()) { // 炉内物煮沸 boiled = true; } } public boolean isEmpty() { return empty; } public boolean isBoiled() { return boiled; } } 把ChocolateBoiler类设计成单件 public class ChocolateBoiler { private boolean empty; private boolean boiled; private static ChocolateBoiler uniqueInstance; … public static ChocolateBoiler getInstance() { if (uniqueInstance == null) { System.out.println(Creating unique instance of Chocolate Boiler); uniqueInstance = new ChocolateBoiler(); } System.out.println(Returning instance of Chocolate Boiler); return uniqueInstance; } … } 单件模式定义 类图 使用多线程 Java支持多线程编程。如果用多线程对ChocolateBoiler 进行优化,会不会有什么问题? 每个Java应用程序会启动一个主线程—将main()放在它 自己执行空间的最开始处。 Java虚拟机会负责主线程的启 动(以及比如垃圾收集所需的系统用线程)。程序员负责 启动自己的线程。 处理多线程 只要把getInstance()变成同步(synchronized)方法,多线程 灾难几乎就可以轻易解决了: public class Singleton { private static Singleton uniqueInsta
文档评论(0)