同步方法与块的性能

ben*_*n75 2 java performance synchronized

我有一个类,所有方法都需要同步(没有静态方法).其中一种方法将每50 ms调用一次.

我想知道在哪里放置synchronized关键字有最短的执行时间?

即关于执行时间的2个选项之间是否有任何差异?

选项1(同步方法)

public class MyNativeObject{

     private boolean released = false;

     public synchronized String read(){
         if(released) return null;
         return Read(); 
     }

     public synchronized void release(){
         if(released) return;
         released = true;
         Release();
     }
     private native String Read();
     private native void Release();
}
Run Code Online (Sandbox Code Playgroud)

选项2(同步块)

public class MyNativeObject{

     private Boolean released = false;

     public String read(){
         synchronized(released){
             if(released) return null;
             return Read(); 
         }
     }

     public void release(){
         synchronized(released){
             if(released) return;
             released = true;
             Release();
         }
     }
     private native String Read();
     private native void Release();
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 6

选项#1工作,并且几乎是完美的,除了同步对象对外部可见,如果可能应该避免.

方案2是非常危险的,可能是错的,因为你的变化同步(当物体released从变化Boolean.TRUEBoolean.FALSE它会在另一个对象同步!

选项#3将是这样的:

public class MyNativeObject{

     private boolean released = false;
     private final Object monitor = new Object[0];

     public String read(){
         synchronized(monitor){
             if(released) return null;
             return Read(); 
         }
     }

     public void release(){
         synchronized(monitor){
             if(released) return;
             released = true;
             Release();
         }
     }
     private native String Read();
     private native void Release();
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是使用一个对象作为无法从代码外部访问的监视器(请参阅此页面以了解我使用的new Object[0]代替更常见的代码new Object()).这样,没有其他同步会干扰您的同步.

  • @assylias:我正在使用一个数组,因为`new Object [0]`是可序列化的,但`new Object()`不是!在这种情况下,这不是问题,但我只是以这种方式学习了这种模式而且没有受到伤害.有关更多信息,请参见http://projectlombok.org/features/Synchronized.html. (2认同)

Pet*_*rey 6

你不能有一个同步的类.

正如约阿希姆指出的那样,选项2是错误的,因为你锁定a)一个改变的领域和b)一个全局对象.

同步方法不仅是唯一有效的方法,而且是最简单的方法,我将使用它.

典型的锁定需要大约50纳秒,所以如果你每50,000,000纳秒调用这些方法,它就不太可能产生任何差别.

public class MyNativeObject{

     private boolean released = false;

     public synchronized String read(){
         return released ? null : Read(); 
     }

     public synchronized void release(){
         if(released) return;
         released = true;
         Release();
     }

     // make the native methods static if you can.
     private static native String Read();
     private static native void Release();
}
Run Code Online (Sandbox Code Playgroud)