2013-07-22 5 views
6
public synchronized int getCountOne() { 
     return count++; 
} 

上記のコードと同様に、メソッドの同期化は、メソッドの本体の周りにsynchronized (this) blockを持つことと機能的に同等です。オブジェクト "this"はロックされず、オブジェクト "this"はmutexとして使用され、ボディは "this"で同期された他のコードセクションと同時に実行されません。我々は、クラスレベルlock.Asを取得するときに我々が機能クラスレベルのロックの取得方法

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

を持っている場合、明らかに2つのスレッドが同時にgetCountOne(オブジェクトレベルロック)のロックを取得することができるmutexとして使用されるものを同様の理由で

とgetCountTwo(クラスレベルロック)したがってgetCountOneは

と同じです。
public int getCountOne() { 
    synchronized(this) { 
      return count++; 
    } 
} 

getCountTwoに相当しますか?クラスレベルのロックを取得するために使用される基準がない場合ミューテックスとして使用されるものを同様の理由で

答えて

10

我々は、クラスレベルのロックを取得

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

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

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

JLS Section §8.4.3.6を参照してください:

それが実行される前に、同期方法は、モニタ(§17.1)を取得します。

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

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

強調鉱山。

+0

ありがとうございました説明 – Prabhaker

0

オブジェクト・レベルのロッキング:あなたが唯一のスレッドが所与の上のコードブロックを実行することができるであろうように、非静的メソッドまたは非静的コードブロックを同期させたい場合

オブジェクト・レベルのロッキング機構でありますクラスのインスタンスこれは、インスタンスレベルのデータをスレッドセーフにするために常に行われます。これは以下のように行うことができる。

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()を実行できるスレッドは1つだけで、他のすべてのインスタンスは他のスレッドに対してロックされます。これは、静的データ・スレッドを安全にするために常に行われます。

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 
    } 
} 
} 
+0

「ミューテックスとして使用されているもの」という質問には答えませんか? – EJP

関連する問題