多线程情况下的Java设计模式: Factory vs Singleton?

标签 java multithreading design-patterns factory-pattern

建议明智地创建新对象并使用相同的对象实例而不是创建新对象。我对决定在以下场景中创建对象的解决方案不太有信心。有一个 SOAP 服务类,它有多个方法,负责多个操作 顾客。请参阅下面的模板,

Public class SOAPService {          
            public Object getProductList(String CustId, String endPoint){
                SOAPStub stub = new SOAPStub(endPoint);
                Object productList = stub.getProductList();
                return productList;
            }
            public Object getProductInfo(String CustId, String productId, String endPoint){
                SOAPStub stub = new SOAPStub(endPoint);
                Object productInfo = stub.getProductList(productId);
                return productInfo;
            }
    }

现在我引入了一个工厂方法来为每个客户创建对象并将其放入映射中,但是当单个客户的多个线程访问服务类时我感到很困惑。对象的行为是否会像单例一样,或者可能导致任何死锁问题或使线程等待?请赐教。

    Public class SOAPService {
        private Map<String, SOAPStub> map = new HashMap<String, SOAPStub>();
        public SOAPStub getSOAPObject(String CustId, String endPoint){
            if(map.containsKey(CustId))
                return map.get(CustId);
            else{
                SOAPStub stub = new SOAPStub(endPoint);
                map.put(custId, stub);
                return stub;
                }
        }
        public Object getProductList(String CustId, String endPoint){
            SOAPStub stub = getSOAPObject(CustId, endPoint);
            Object productList = stub.getProductList();
            return productList;
        }

        public Object getProductInfo(String CustId, String productId, String endPoint){
            SOAPStub stub = getSOAPObject(CustId, endPoint);
            Object productInfo = stub.getProductList(productId);
            return productInfo;
        }
    }

最佳答案

您的 HashMap 不是线程安全的,并且您所走的整个路径是否高效似乎值得怀疑。您的线程可能会将所有时间都花在阻塞对共享池的访问上,并且随着负载的增加,争用会变得更糟。尽可能使线程彼此独立,即使这会使它们使用更多内存。

一般来说,资源密集型对象(例如数据库连接)的保留池。请参阅this question about object pooling 。缓存可能对您有帮助,请研究像 ehcache 这样的缓存提供程序。滚动您自己的缓存比您想象的更麻烦。

关于多线程情况下的Java设计模式: Factory vs Singleton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35645089/

相关文章:

java - 将 int 传递给以 Integer 作为参数的方法?

c# - 在 HttpModule 中正确使用 ConcurrentQueue?

c# - 在用户填写登录文本框时预加载整个主表单

asp.net-mvc - MVC Web 应用程序应该是 3 层吗?

go - 应用程序设计 : Central vs Private cache

oop - 这种设计模式的名称?

java - 在 Java 中分析并发程序行为的特性

java - 解析 XML 时出现 IllegalStateException?

android - NDK/JNI : identifying current thread

Java 服务器和客户端套接字需要修复