论坛首页 Java企业应用论坛

单例工厂模式在调用SOAP接口时,当并发时该类对像是否唯一不...

浏览 6373 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-27  
SOA
单例代码:
private static   HelloClient  factory;
............................
public static HelloClient  getInstance() {
        if (factory == null) {
            //使用synchronzed保证一次只有一个实例能访问DBUser对象
            synchronized (initLock) {
                if (factory == null) {
                    try {
                        //创建DBUser的一个实例
                        Class c = Class.forName(CLASSNAME);
                        factory = (HelloClient ) c.newInstance();
                                     }
                    catch (Exception e) {。。  }
                }
            }
        }
        return factory;
    }

这是一个soap远程服务的一个接口

private String CallClient() {
    。。。。。。。。。。。。。。。。。

    }

***************************************

我在调用时这样子写:
RolesFactory.getInstance() .CallClient();
即可以访问服务端.

问题出现在这里,最上面的。private  HelloClient  factory;
这样了写法,公司同事认为是全局变量,当多个人并发时,对像会被改变。

而我的理解是(因为我认为调用远程接口,只能有唯一一个对像实例),创建唯一的接口对像。每个人调用对像是唯一的,而改变的只是调用CallClient();这个方法。

难道这时不能用全局变量吗。?????
**********************************
下面是修改过了,就是要把HelloClient factory 这个定义在方法里面,而不是全局变量。同事说这样创键的对像在并发时才不会被修改。。

我还是不明白。。。。
    /**
     * 创建对像工厂
     * @return HelloClient
     */
    public static  HelloClient getInstance() {
    HelloClient factory = null;
        try {
            //创建soapFactory的一个实例
            //Class c = Class.forName(CLASSNAME);
            factory = (HelloClient)new HelloClient();
            System.out.println("新建一个HelloClient对像");
        } catch (Exception e) {
            System.err.println(
                    "soapFactory Exception loading class: " +
                    e.getMessage());
            e.printStackTrace();
        }
        return factory;
    }
   发表时间:2005-06-27  
这个问题取决于你的这个单例是否是immuteable(不可变)还是muteable(可变)的,如果你的对象是不可变的,就不会发生你所说的问题。如是可变的,确实会有你说的问题。

按照你的改法,将产生多个实例。
0 请登录后投票
   发表时间:2005-06-30  
我的理解是,单例生成有如:

class c = new class();

在整个工和系统中永远是唯一的。不管哪一个人先创建。最上面有做同步的方式,永远也只有一个。因为是全局变量,这时只是一个对像,根本没有什么调用方法。所以在这个对像所调用的方法不会因为其它人调用时所串改。。

所有一进去这个系统的人都调用这个对像,不会改变掉这个对像的值,即使是并发,也不会被改变。。。。

而把对像放在方法里面,就不是全局变量了,每个人都会产生一个对像。

我就是不明白全局变量的对像在这里会因并发时他所调用的方法会被串改。???
0 请登录后投票
   发表时间:2005-07-01  
Singleton 模式 Effective Java 中给出了一个最佳实践


public class Singleton {
 
    private Singleton(); {
    }   
    
    public static Singleton getInstance(); {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        static Singleton instance = new Singleton();;
    }

}



该实现的优美之处在于利用了 "一个类只有在被调用的时候才被初始化"
0 请登录后投票
   发表时间:2005-07-02  
Feiing 写道
Singleton 模式 Effective Java 中给出了一个最佳实践


public class Singleton {
 
    private Singleton(); {
    }   
    
    public Singleton getInstance(); {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        static Singleton instance = new Singleton();;
    }

}



该实现的优美之处在于利用了 "一个类只有在被调用的时候才被初始化"



那我想问清楚,那单例的变量定为静态放在全局,会不会因为用户的不同,调用时而被修改呢,(我认为是不为被修改)那到底这个变量会不会被修改呢。
0 请登录后投票
   发表时间:2005-07-02  
Sorry, getInstance() 方法忘了加 static, 已经加上了

你的第一种做法可能会因为并发返回多个实例,  第二种做法每次都返回新的实例, 已经不是 singleton 了
0 请登录后投票
   发表时间:2005-07-03  
Feiing 写道
Sorry, getInstance() 方法忘了加 static, 已经加上了

你的第一种做法可能会因为并发返回多个实例,  第二种做法每次都返回新的实例, 已经不是 singleton 了

**********************************

对不起:我在第一个写法时也忘记了加 static;

第一种在并发时会返回多个实例,我觉得应该不会吧。这种写法在jive的论坛里好像也都是这样写了。因为有synchronized (initLock) 同步锁。我是觉得在整个里只有一个实例。

第二种写法是每次都有他自已的实例,比如一个有登陆,他的实例也是永远只有这一个。


如果说表示层与逻辑层放在同一台机子上呢?这两种方法可能并发处里的修改机会是不是会小点呢。

但现在是我的表示层与业务逻辑层是放在不同的机了上,中间通过soap来传递数据。这时第一种方法在并发时,会不会被修改呢??
0 请登录后投票
   发表时间:2005-07-25  
每次别人的调用并没有改变你创建的对象啊。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics