私は今、Javaの並行性を学んでいます。私はこのようなコードの一部に出くわした:このコードは、同期メソッドを呼び出すためにさまざまなオブジェクトを使用しているので同期されたメソッドが別のオブジェクトでロックされるのはなぜですか?
package pac1;
import java.util.*;
import java.util.concurrent.*;
class A1 {
public void f() {
synchronized (this) {
for (int i = 0; i < 5; i++)
System.out.println("f()");
}
}
}
class B1 {
public void g() {
synchronized (this) {
for (int i = 0; i < 5; i++)
System.out.println("g()");
}
}
}
class C1 {
public void p() {
synchronized (this) {
for (int i = 0; i < 5; i++)
System.out.println("p()");
}
}
}
public class V {
public static void main(String[] args) {
A1 a = new A1();
B1 b = new B1();
C1 c = new C1();
new Thread() {
public void run() {
a.f();
}
}.start();
new Thread() {
public void run() {
c.p();
}
}.start();
b.g();
}
}
、私はそれが相互に干渉することを防ぐないだろうと推測しました。しかし、結果は次のとおりです。BTW
、結果は同じ使用してロックである:実際に
package pac1;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class A {
Lock lock = new ReentrantLock();
public void f() {
lock.lock();
try {
for (int i = 0; i < 5; i++)
System.out.println("f()");
} finally {
lock.unlock();
}
}
}
class B {
Lock lock = new ReentrantLock();
public void g() {
lock.lock();
try {
for (int i = 0; i < 5; i++)
System.out.println("g()");
} finally {
lock.unlock();
}
}
}
class C {
Lock lock = new ReentrantLock();
public void p() {
lock.lock();
try {
for (int i = 0; i < 5; i++)
System.out.println("p()");
} finally {
lock.unlock();
}
}
}
public class Ex16 {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
new Thread() {
public void run() {
a.f();
}
}.start();
new Thread() {
public void run() {
c.p();
}
}.start();
b.g();
}
}
さらに多くのものを印刷してみてください。最初のスレッドのメソッドを実行している間にJavaが終了し、2番目のスレッドのメソッドを実行してから、実際にメインメソッドの実行が終了する前に、すべてが1,3,2の順序で印刷されます。私はあなたがそれぞれ1000人いたら混乱するだろうと思う。 – gandaliter
彼らはお互いに干渉していると思いますか?各繰り返しでThread.sleep(500)への呼び出しを追加します。 –