そして、クラス A の任意のインスタンスをロックでき、それが何らかの方法でクラス A の別のインスタンスをロックするのに役立つという考えの罠に陥らないでください。これは古典的な初心者の間違いです。
私はそれを理解する前に数回間違いを犯しました。しかし、静的ロック オブジェクトは正しく機能します。
マイスレッド
package com.replanet;
public class MyThread extends Thread {
private int x, y;
private static Object lock3 = new Object();
public MyThread(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
super.run();
try {
test_Method();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void test_Method() throws InterruptedException {
synchronized (lock3) {
System.out.println("test_Method " + Thread.currentThread().getName());
for (int i = 0; i < Integer.MAX_VALUE; i++) {
if (i == Integer.MAX_VALUE / 2) {
Thread.sleep(2000);
System.out
.println("Leaving test_Method on " + Thread.currentThread().getName());
return;
}
}
}
}
}
使用法
package com.replanet;
public class Main {
public static void main(String[] args) {
MyThread myThread1 = new MyThread(1, 2);
MyThread myThread2 = new MyThread(1, 2);
myThread1.start();
myThread2.start();
}
}
出力
test_Method Thread-0
Leaving test_Method on Thread-0
test_Method Thread-1
Leaving test_Method on Thread-1
非静的ロック オブジェクトでの出力 (私には合いません)
test_Method Thread-0
test_Method Thread-1
Leaving test_Method on Thread-1
Leaving test_Method on Thread-0
static
lock オブジェクトを使用するのは良い考えですか?