同期ブロックと同期方法の違いの例

1987 ワード

コードの例:

public class SyncTest
{
    static Object obj = new Object();

    public static void main(String[] args)
    {
        
        T1 t1 = new T1();
        T2 t2 = new T2();        
        t1.start();
        t2.start();
    }
    
    public static void test1()
    {
        synchronized(obj)
        {
            try
            {
                Thread.sleep(5000);
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.err.println("====");
            System.err.println("test1");
        }
    }
    
    public static synchronized void test2()
    {
        System.err.println("****");
        System.err.println("test2");
    }

}

class T1 extends Thread
{
    public void run()
    {
        SyncTest.test1();
    }
}

class T2 extends Thread
{
    public void run()
    {
        SyncTest.test2();
    }
}

実行結果:
****
test2
5秒待ち
====
test1
同期メソッドを使用する場合

public static synchronized void test1()
    {
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.err.println("====");
        System.err.println("test1");
    }

実行結果:
5秒待ち
====
test1
****
test2
結論:同期メソッドは現在のオブジェクトを同期ロックとし、同期ロックが有効になった後、そのオブジェクト内のすべての同期メソッドを呼び出すことはできません.