0
私は、同期化機能を持つクラスc
を持っていますm1
、m2
、m3
です。私は同じクラスの3つの異なるインスタンスを作成しましたc1
,c2
,c3
それぞれ異なるスレッドで実行していますt1
,t2
、t3
それぞれ。もしt1
アクセスm1
はt2
、t3
アクセスm1
??同じクラスの異なるオブジェクトの同期メソッド
私は、同期化機能を持つクラスc
を持っていますm1
、m2
、m3
です。私は同じクラスの3つの異なるインスタンスを作成しましたc1
,c2
,c3
それぞれ異なるスレッドで実行していますt1
,t2
、t3
それぞれ。もしt1
アクセスm1
はt2
、t3
アクセスm1
??同じクラスの異なるオブジェクトの同期メソッド
に依存します。メソッドが静的である場合、それらはクラスオブジェクト上で同期し、インタリーブは不可能である。静的でない場合は、this
で同期します。オブジェクトとインターリーブが可能です。次の例では、動作を明確にする必要があります。
import java.util.ArrayList;
import java.util.List;
class Main {
public static void main(String... args) {
List<Thread> threads = new ArrayList<Thread>();
System.out.println("----- First Test, static method -----");
for (int i = 0; i < 4; ++i) {
threads.add(new Thread(() -> {
Main.m1();
}));
}
for (Thread t : threads) {
t.start();
}
for (Thread t : threads) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("----- Second Test, non-static method -----");
threads.clear();
for (int i = 0; i < 4; ++i) {
threads.add(new Thread(() -> {
new Main().m2();
}));
}
for (Thread t : threads) {
t.start();
}
for (Thread t : threads) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("----- Third Test, non-static method, same object -----");
threads.clear();
final Main m = new Main();
for (int i = 0; i < 4; ++i) {
threads.add(new Thread(() -> {
m.m2();
}));
}
for (Thread t : threads) {
t.start();
}
for (Thread t : threads) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static synchronized void m1() {
System.out.println(Thread.currentThread() + ": starting.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + ": stopping.");
}
public synchronized void m2() {
System.out.println(Thread.currentThread() + ": starting.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + ": stopping.");
}
}
詳細については、this oracle pageを参照してください。
Aaah ....私の悪いところを完全に忘れてしまった。 –
@ KAY_YAK、この回答があなたの問題を解決した場合は、それを受け入れたものとしてマークしてください。 –