synchronized修飾方法で使用するオブジェクトロック
1571 ワード
synchronizedをstaticメソッドに追加する前にclassにロック、すなわちクラスロックを追加します.synchronizedを非静的メソッドの前に追加するのは、オブジェクトに鍵をかけることです.
1.ThreadAはdoLongTimeTaskA()を実行し、ThreadBはdoLongTimeTaskB()を実行します.この場合、ThreadBはThreadAの実行が完了するまで待つ必要があります.したがって,クラスロック(synchronized修飾の静的手法)は同期的である.
2 ThreadCはdoLongTimeTaskC()を実行する必要があります.この場合、メソッドのロックはインスタンス化されたオブジェクトです.
public class Task2 {
public synchronized static void doLongTimeTaskA() {
System.out.println("name = " + Thread.currentThread().getName() + ", begain");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("name = " + Thread.currentThread().getName() + ", end");
}
public synchronized static void doLongTimeTaskB() {
System.out.println("name = " + Thread.currentThread().getName() + ", begain");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("name = " + Thread.currentThread().getName() + ", end");
}
public synchronized void doLongTimeTaskC() {
System.out.println("name = " + Thread.currentThread().getName() + ", begain");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("name = " + Thread.currentThread().getName() + ", end");
}
1.ThreadAはdoLongTimeTaskA()を実行し、ThreadBはdoLongTimeTaskB()を実行します.この場合、ThreadBはThreadAの実行が完了するまで待つ必要があります.したがって,クラスロック(synchronized修飾の静的手法)は同期的である.
2 ThreadCはdoLongTimeTaskC()を実行する必要があります.この場合、メソッドのロックはインスタンス化されたオブジェクトです.