鍵の説明
2409 ワード
コードを見てください:
(1)スレッドt 1(td 1)は、1人に相当する.
(2)対象o 1はロックに相当する.ロックは、独占リソースとも呼ばれます.
(3)synchronized(o 1)は部屋の財産に相当する.
スレッドt 1がsynchronized(o 1)に実行されると、この人が部屋に入ったことに相当し、同時に部屋のドアをロック(すなわちo 1ロック)し、スレッドt 1がsynchronized(o 1)のコードセグメントを出た後、この人が部屋を出たことに相当し、同時にロックを解放し、他の人(例えばt 2)がロックを持つことができ、部屋に入ることができる.
上端コード,t 1,t 2の2つのスレッドを見てみると,まずt 1がrun()メソッドに入り,次にflagが1であるか否かを判断し,1であるとオブジェクトo 1によって次のコードをロックし,同時にt 2がrun()メソッドに入りflag,0であると判断すると,o 2によって次のコードをロックし,再び振り返ると,t 1は下向きに実行され,synchronized(o 2)に実行され,このときo 2オブジェクトはt 2にロックされ,したがって、o 1は、o 2オブジェクトのロック解除フラグを待つのを開始し、同様に、t 2は下に進むsynchronized(o 1)に実行され、o 1オブジェクトのロック解除フラグを待つのを開始する.このように互いに待ち合うと、デッドロックが発生する.注意:static Object o 1=new Object()を前のstaticを外すとデッドロックは発生しません.これは、この2つのスレッドには独自のo 1があります.つまり、ロックは共通ではないので、デッドロックは発生しません.
public class TestDeadLock implements Runnable{
int flag = 1;
static Object o1 = new Object(); // 1,
static Object o2 = new Object(); // 2,
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
// , , , synchronized ,
public void run() {
if(flag == 1){
synchronized(o1)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println("t1 succeed");
}
}
}
if(flag == 0){
synchronized(o2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println("t2 succeed");
}
}
}
}
}
(1)スレッドt 1(td 1)は、1人に相当する.
(2)対象o 1はロックに相当する.ロックは、独占リソースとも呼ばれます.
(3)synchronized(o 1)は部屋の財産に相当する.
スレッドt 1がsynchronized(o 1)に実行されると、この人が部屋に入ったことに相当し、同時に部屋のドアをロック(すなわちo 1ロック)し、スレッドt 1がsynchronized(o 1)のコードセグメントを出た後、この人が部屋を出たことに相当し、同時にロックを解放し、他の人(例えばt 2)がロックを持つことができ、部屋に入ることができる.
上端コード,t 1,t 2の2つのスレッドを見てみると,まずt 1がrun()メソッドに入り,次にflagが1であるか否かを判断し,1であるとオブジェクトo 1によって次のコードをロックし,同時にt 2がrun()メソッドに入りflag,0であると判断すると,o 2によって次のコードをロックし,再び振り返ると,t 1は下向きに実行され,synchronized(o 2)に実行され,このときo 2オブジェクトはt 2にロックされ,したがって、o 1は、o 2オブジェクトのロック解除フラグを待つのを開始し、同様に、t 2は下に進むsynchronized(o 1)に実行され、o 1オブジェクトのロック解除フラグを待つのを開始する.このように互いに待ち合うと、デッドロックが発生する.注意:static Object o 1=new Object()を前のstaticを外すとデッドロックは発生しません.これは、この2つのスレッドには独自のo 1があります.つまり、ロックは共通ではないので、デッドロックは発生しません.