KTr*_*rum 3 java exception synchronized
我有一个方法,许多线程并行访问,该方法使用一个具有两个我无法控制的同步方法的类.getObject和createNewObject.我想确保我不创建多个对象(MyObject).
MyObject obj;
public void method1() {
obj = getObject("key");
if (obj == null)
obj = createNewObject("key");
}
Run Code Online (Sandbox Code Playgroud)
我认为这不会起作用,因为线程可以在获取和创建方法之间暂停,因此另一个线程也可以进入并创建一个对象.同步的createNewObject方法通过检查对象是否已存在名为"key"并在这种情况下抛出异常来解决此问题.
将优先考虑以下哪种方法?性能,安全性和设计明智.我听说双锁型(方法3)不起作用?也许我应该使用method1?
大多数时候,会找到对象,所以没有问题.在极少数情况下跳过同步并处理异常可能会有更好的性能吗?
MyObject obj;
public synchronized void method1() {
obj = getObject("key");
if (obj == null)
obj = createNewObject("key");
}
public void method2() {
obj = getObject("key");
if (obj == null)
try {
obj = createNewObject("key");
} catch (Exception e) { // ops, someone already created object "key"
obj = getObject();
}
}
public void method3() {
obj = getObject("key");
if (obj == null)
obj = getObj("key");
}
public synchronized MyObject getObj(String key) {
MyObject obj = getObject(key);
if (obj == null)
obj = createNewObject(key);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |