gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:53:46 25 4
gpt4 key购买 nike

建议明智地创建新对象并使用相同的对象实例而不是创建新对象。我对决定在以下场景中创建对象的解决方案不太有信心。有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com