同期ブロックと同期方法の違いの例
1987 ワード
コードの例:
実行結果:
****
test2
5秒待ち
====
test1
同期メソッドを使用する場合
実行結果:
5秒待ち
====
test1
****
test2
結論:同期メソッドは現在のオブジェクトを同期ロックとし、同期ロックが有効になった後、そのオブジェクト内のすべての同期メソッドを呼び出すことはできません.
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
結論:同期メソッドは現在のオブジェクトを同期ロックとし、同期ロックが有効になった後、そのオブジェクト内のすべての同期メソッドを呼び出すことはできません.