0 0

单子模式,如何修改,进来看看。3

~有事情要讨论。

~大家都知道单子模式吧。

单子模式下。是需要用到 synchronized的。

但是 他比 非同步慢 100陪 可能

~但  只有第一次调用该方法才需要 同步 一旦 初始化 完成同步操作 就完全没必要了。。

~大家觉得应该怎么去 改改。


就好比
private static  Resoure res=null;
public static synchronized Resource getResource(){
if(res==null){
res = new Resource();
}
return res;
}
这个方法在多线程情况下可能 有线程同时到 if(res==null)这个上面,当然我们用到了 synchronized 不会有问题,但是速度非常慢。况且 我们只需要第一调用才用到同步,一旦res初始化后同步操作 就完全没必要了。
应该如何修改。
2008年8月04日 16:07

6个答案 按时间排序 按投票排序

0 0

public class SyncSingleton {  
    private static SyncSingleton syncSingleton;  
    private static final Object classLock = SyncSingleton.class;  //同步琐  
      
    private SyncSingleton(){}  
      
    public SyncSingleton getInstance(){  
        synchronized(classLock){  
            if(syncSingleton == null)  
                syncSingleton = new SyncSingleton();  
            return syncSingleton;  
        }  
    }  


这种方式,所以的线程都必须等待这个检查过程的完成。这种同步会造成严重的性能瓶劲

改用下面这种方式:
public class DoubleCheckedLocking {  
    private static DoubleCheckedLocking dcl;  
      
    private DoubleCheckedLocking(){}  
      
    private synchronized static void doSync(){  
        if(dcl == null)   
            dcl = new DoubleCheckedLocking();  
    }  
      
    public DoubleCheckedLocking getInstance(){  
        if(dcl == null)  //一重检查  
            doSync();    //同步的二重检查  
        return dcl;  
    }  


在检查之后(if (instance == null))再放置一些同步代码, 但是还是可能出现多个现成同时通过了检查。我们改进一下,检查之后,在同步代码中再检查一边,这样就是“双重锁定检查”模式了。它能将非必须的锁定优化掉。这里的同步检查最多发生一次。不会造成性能瓶劲。


在我的博客中有此问题的笔记:http://zhaipuhong.iteye.com/blog/214675
有问题请给我流言,大家一起讨论学习。

2008年8月05日 10:45
0 0

打错啦,应该是这样的:

   

private static Resoure res=null;  
    public static synchronized Resource getResource(){  
        if(res==null){ 
            synchronized{  
                res = new Resource();  
            }  
        }  
        return res;  
    }   




这样synchronized只会运行一次,就不会出现速度的问题,而且保证啦线程间的安全

不知道这么说,楼主满意否?呵呵

:arrow:

2008年8月05日 08:45
0 0

引用
不想用synchronized就改用final static嘛
单例模式又不是只有这一种


那不一样存在多线程问题根不加一个样

建议楼主用小改下程序,因为synchronized只在
if(res==null){
    res = new Resource();
} 

这里起作用,所以可以这么写

private static Resoure res=null;
public static synchronized Resource getResource(){
    synchronized{
        if(res==null){
            res = new Resource();
        }
    }
    return res;
} 


这样synchronized只会运行一次,就不会出现速度的问题,而且保证啦线程间的安全

不知道这么说,楼主满意否?呵呵

:arrow:

2008年8月05日 08:42
0 0

不想用synchronized就改用final static嘛
单例模式又不是只有这一种

2008年8月04日 17:08
0 0

是Web的系统还是?

如果是Web的系统完全没有必要做同步,而应该是在Web启动的时候加上这个东西。另外,可以把这个方法拆成两个,一个是返回Resource的,只需要单例加同步。另一个是从硬盘读Resource的,可以加同步。

这两种方式都可以吧。

2008年8月04日 16:56
0 0

如果Resource类是无参的构造方法,那这种方式就是最好的了。

private static Resoure res=new Resoure();
public static synchronized Resource getResource(){
    return res;
}

如果有参数的话,就只能以楼主的那种方式了,慢就慢吧,叫用户忍着点吧。

2008年8月04日 16:56

相关推荐

    (两种)单子模式 (饿汉,懒汉)

    单子模式是一种设计模式,它的主要目标是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式常用于系统管理类,如日志、配置对象等,以避免资源浪费和保证数据一致性。 ...

    设计模式一(单子、工厂、策略模式)练习 .zip

    设计模式一(单子、工厂、策略模式)练习 1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本 7%的促销折扣;而对非教材类的计算 机...

    JDBC的连接实例 单子模式的写法

    ### JDBC的连接实例与单例模式的写法详解 在Java开发中,JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。本文将...

    单子样惯导和松组合.zip

    《MATLAB实现的单子样惯导与松组合导航系统详解》 惯性导航系统(Inertial Navigation System,简称INS)是一种自主式导航技术,它利用惯性测量装置(如陀螺仪和加速度计)来连续地计算物体在三维空间中的位置、...

    北邮Java大作业低配版

    设计模式一(单子、工厂、策略模式)练习 1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机图书...

    北邮java选修大作业 购物车

    大作业设计模式一(单子、工厂、策略模式)练习 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机...

    (中小学教育)一张单子教案.doc

    2. **理解故事与情境教学**:通过讲述《一张单子》的故事,孩子们不仅能理解故事内容,还能从中领悟到生活中的道理。故事的第一部分强调了蛤蟆如何按照计划行事,第二部分展示了面对突发情况时计划的可变性,第三...

    excel 打印几种快递单子

    excel做的快递单子打印,也是从网上下载的。希望对大家有帮助,(*^__^*) 嘻嘻……

    Remedy 单子看板系统

    Remedy 功能很强大,但无法实时显示SLA,以及每个单子的状态,团队的绩效。所以我们自己开发了remedy 单子看板系统。

    单子元件快速查询软件

    学习单片机的一看就知道 这个是多有用的哈哈。。学习单片机的一看就知道 这个是多有用的哈哈。。

    软件体系结构设计模式ppt课件.ppt

    软件体系结构设计模式ppt课件 软件体系结构设计模式是指在软件设计和开发过程中不断总结出来的...4. 单例/单子模式 5. 类的适配器模式 6. 对象的适配器模式 这些设计模式的目标都是为了使软件降低耦合,增强灵活性。

    dhcp服务器配置与应用--单子网

    ### DHCP服务器配置与应用——单子网 #### 安装DHCP服务软件包 在Linux系统上部署DHCP服务的第一步是确保系统已安装DHCP服务软件包。可以通过以下步骤来实现: 1. **检查是否已安装DHCP:** ```shell # rpm -qa ...

    北邮java李劼java大作业,设计模式二

    1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;...使用策略模式、工厂模式、单子模式进行设计,类图如下。

    PHP设计模式

    4、单子模式 5、注册模式 6、模拟对象模式 7、策略模式 8、迭代器模式 9、观察者模式 10、规范模式 11、代理模式 12、装饰模式 13、适配器模式 14、Active Record模式 15、Table Data Gatway模式 16、数据映射模式 ...

    淘宝打印快递单子

    淘宝打印快递单子 淘宝卖家专用 非常好使 方便快捷

    !20_关闭所有盈利单子.ex4

    所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用所有平仓功能使用

    句法模式识别.zip

    句法模式识别主要章节有:形式语言概述、文法推断、句法分析、自动机理论。对于某些图像识别问题,描绘图像结构信息非常重要,不仅要求判断图形属于哪一类,而且能够描绘使该图形不属于其他类的性能。图片识别或者更...

    单子

    在JavaScript中,单子通常通过特定的模式实现,比如`bind`或`chain`方法,以及一个初始化的单元值。 单子的核心思想是它们定义了两个操作:一个用于创建单子实例(通常是构造函数),另一个用于组合单子(如`bind`...

    java实验:设计模式2.doc

    在这个Java实验中,我们主要涉及了五个设计模式:单子(Singleton)、工厂(Factory)、策略(Strategy)、组合(Composite)和观察者(Observer)模式。这些模式被应用于构建一个电子商务网站的购物车系统。 首先...

Global site tag (gtag.js) - Google Analytics