7
public synchronized int getCountOne() {
        return count++;
 }

synchronized (this) block上記のコードのように、メソッドで同期することは、メソッドの本体を囲むことと機能的に同等です。オブジェクト "this" はロックされず、オブジェクト "this" が として使用されmutex、本体が "this" で同期されている他のコード セクションと同時に実行されないようにします。

同様の理由でmutex、クラス レベル ロックを取得するときにとして使用されるもの。

public static synchronized int getCountTwo() {
        return count++;
 }

obviously two threads can simultaneously obtain locks on getCountOne(object level lock) and getCountTwo(class level lock). So as getCountOne is analogous to

public int getCountOne() {
     synchronized(this) {
          return count++;
     }
 }

is there an equivalent of getCountTwo? If no what criteria is used to obtain a Class level lock?

4

2 に答える 2

10

同様の理由で、クラスレベルのロックを取得するときにミューテックスとして使用されるもの

クラス オブジェクト自体がミューテックスとして使用されます。static synchronizedメソッドの同等の同期ブロックは次のようになります。

public static int getCountTwo() {
     synchronized(ClassName.class) {
          return count++;
     }
}

ClassNameそのメソッドを含むクラスの名前です。

JLS セクション §8.4.3.6を参照してください。

同期メソッドは、実行前にモニター (§17.1) を取得します。

クラス (静的) メソッドの場合、メソッドのクラスの Class オブジェクトに関連付けられたモニターが使用されます。

インスタンス メソッドの場合、これ (メソッドが呼び出されたオブジェクト) に関連付けられたモニターが使用されます。

鉱山を強調します。

于 2013-07-22T09:10:08.840 に答える
0

オブジェクト レベルのロック:

オブジェクト レベルのロックは、クラスの特定のインスタンスで 1 つのスレッドのみがコード ブロックを実行できるように、非静的メソッドまたは非静的コード ブロックを同期する場合のメカニズムです。これは、インスタンス レベルのデータをスレッド セーフにするために常に実行する必要があります。これは以下のように行うことができます:

public class DemoClass 
{ 
  public synchronized void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
  public void demoMethod(){ 
  synchronized (this) 
  { 
   //other thread safe code 
  } 
 } 
} 

or 

public class DemoClass 
{ 
  private final Object lock = new Object(); 
  public void demoMethod(){ 
  synchronized (lock) 
 { 
  //other thread safe code 
 } 
} 

クラス レベルのロック:

クラス レベルのロックにより、複数のスレッドが実行時に使用可能なすべてのインスタンスの同期ブロックに入ることを防ぎます。これは、実行時に DemoClass のインスタンスが 100 個ある場合、いずれかのインスタンスで一度に 1 つのスレッドのみが demoMethod() を実行でき、他のすべてのインスタンスは他のスレッドに対してロックされることを意味します。これは、静的データをスレッドセーフにするために常に実行する必要があります。

public class DemoClass 
{ 
  public synchronized static void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
  public void demoMethod(){ 
  synchronized (DemoClass.class) 
  { 
   //other thread safe code 
  } 
 } 
} 

or 

public class DemoClass 
{ 
 private final static Object lock = new Object(); 
 public void demoMethod(){ 
 synchronized (lock) 
  { 
   //other thread safe code 
  } 
 } 
}
于 2014-01-24T19:06:54.727 に答える