オリジナルリンク:リンクの説明を追加します。
スレッド同期の問題のほとんどは、コードブロックと同期方法を同期覚えておくべき2つの方法がありますが、同期使用して解決するものこれら二つの主な違い
テストコード:
package com.xujingyang.testThread;
public class SynObj{
public synchronized void showA(){
System.out.println("showA..");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void showB(){
synchronized (this) {
System.out.println("showB..");
}
}
public void showC(){
String s="1";
synchronized (s) {
System.out.println("showC..");
}
}
}
package com.xujingyang.testThread;
public class Test {
public static void main(String[] args) {
final SynObj sy=new SynObj();
new Thread(new Runnable() {
@Override
public void run() {
sy.showA();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
sy.showB();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
sy.showC();
}
}).start();
}
}
このコードは、結果をプリントされ、昭和...... showCが......すぐshowBが......時間までの時間だけ出力しますプリントアウトされ、その後、なぜ、すぐshowCそれとして呼ばれることshowBありませんか?
スレッド1つの通話方法Aを開始した後、次に、スレッド1が3秒間スリープする、方法Cを呼び出し、メソッドCは、Sは、ロックオブジェクトの文字列オブジェクトで同期ロック、とここで述べ。B法が異なっている、しかし、これはそのメソッドのAに注意し、現在のオブジェクトでロックされているプラスの方法で直接同期され、どのようなオブジェクトは、それがロックされていますか?明らかに、使用これらの2つの方法は、ロックされています。
これらの結果から、我々は、ロックが解除されていない睡眠中のスレッド1は、このように、我々は2を見ることができる、方法Bを呼び出すためにわずか3秒後にスレッド2が発生するため、これは、使用される同期方法ロックされているものであることを知っていますロックオブジェクトにロック機構の種類、すなわち、現在のオブジェクト、同じです。
さらに、同期メソッドは、メソッド内で、ロック同期コードブロックをロックを実装直接同期方法を適用し、ロック同期方法の範囲が比較的大きいことは明らかであり、範囲はブロックドットを同期させるために、より大きな一般的な同期の範囲、パフォーマンスの悪いことに、一般的な必要性は確かに、時刻を同期するために小さい、より良いので、より優れた性能をロックします。
まず、2つの同時スレッドで同じ対象物がこの同期化(この)同期ブロックにアクセスするときに、時間だけスレッドが実装されます。別のスレッドがコードブロックの実装が完了した後に、コードブロックを実行するために、現在のスレッドを待たなければなりません。
2.しかし、スレッドが同期(本)同期ブロックのオブジェクトにアクセスするときに、別のスレッドが依然として非同期(本)同期ブロック内のオブジェクトにアクセスすることができます。
第三には、スレッドが同期(本)同期ブロックのオブジェクトにアクセスするときに特に重要であり、同期コード・ブロックにアクセスするための同期、他のすべてのスレッド(この)の別の目的は、ブロックされます。