2010-12-11 15 views
2

私は2つのスレッドを作成し、そのオブジェクトの静的および非静的メソッドと呼ばれるクラスの単一インスタンスを使用しました。理想的には、クラス名を使って静的メソッドを呼び出す必要があります。静的メソッドと非静的メソッドの同期ブロック

私は、スレッドが呼び出すメソッドを持つクラスのプライベートな静的メンバーで、静的メソッドと非静的メソッドの両方を同期しました。私は出力が同期していることに気づいた!

私の質問は以下のとおりです。それは通常クラスのインスタンスを必要と同期ブロックを使用して同期場合

  1. 静的メソッドは、それは静的オブジェクトを受け入れたのか!

  2. スタティックメソッドを呼び出すスレッドがクラスレベルのロックを取得し、非スタティックメソッドを呼び出すスレッドがオブジェクトレベルのロックを取得するため、出力がどのように同期しましたか。
    私はオブジェクトに基づいて静的メソッドと非静的メソッドの両方でsynchronizedブロックを使用していますが、実際には同期してはいけません。または、静的オブジェクトの同期ブロックを使用する特別なケースですか?

私にお知らせください。続き

は私が書いたコードです:グローバル

public class StaticNonStaticSynch 
{ 
public static void main(String[] args) 
{ 
    final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); 

    Runnable runnable1 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.nonStaticMethod(); 
    } 
    }; 

    Runnable runnable2 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.staticMethod(); 
    } 
    }; 

    Thread thread1 = new Thread(runnable1, "First Thread"); 
    Thread thread2 = new Thread(runnable2, "Second Thread"); 

    thread1.start(); 
    thread2.start(); 
} 
} 

class StaticNonStaticTest 
{ 
private static Object object = new Object(); 

void nonStaticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 

static void staticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 
} 
+0

テキストを正しく編集してください。コードスニペットに101010アイコンを使用します。 –

+0

_ "非静的メソッドを呼び出すスレッドはオブジェクトレベルのロックを取得します" _オブジェクトレベルのロックを取得しません。インスタンスメソッドは、クラスレベルのロックを取得します。 – khachik

答えて

4

StaticNonStaticTest.objectと呼ばれるものの1つのインスタンスが存在します。そのことを同期させるときはいつでも、同じロックで同期しています(からどこでも関係なく)。

-1

静的オブジェクトに基づいて同期しているのは、ロックがクラスレベルで取得され、静的メソッドと非静的メソッドの両方が同期されている理由です。 静的メソッドと非静的メソッドの "synchronized(object)"行をコメントアウトすると、呼び出しが同期しなくなったことがわかります。

関連する問題