抛出异常与同步

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)

unh*_*ler 8

开始使用,method1直到剖析器告诉你它是瓶颈.这是最干净的实现,你知道它会一直正常工作.如果稍后您看到数据显示您在连续调用时浪费了大量时间,那么您可以考虑尝试其他方法.