Javaでsynchronized(1):概要
1350 ワード
1.synchronizedを使用する理由
同時プログラミングでスレッドセキュリティの問題が発生しました.主な原因は次のとおりです.共有データ が存在する.マルチスレッドは、共有データを共同で操作します.
キーワードsynchronizedは、同じ時点でメソッドまたはコードブロックを実行できるスレッドが1つしかないことを保証し、synchronizedは、volatileの代わりにスレッドの変化が可視(可視性)であることを保証します.
2.synchronizedの役割
このセグメントコードは、同じ時点で最大1つのスレッドのみが実行されることを保証し、同時セキュリティを保証する効果を達成します.
3.例
消失したリクエスト:2つのスレッドが同時にa++を行い、最終的に予想より少ない結果が得られた.
結果は152093で、指定するたびに結果が異なります.
理由:
Count++は、1つの操作のように見えますが、実際には3つの動作が含まれています.
1.countを読み込む
2.countを1つ追加
3.countの値をメモリに書き込む
マルチスレッドを使用する場合、1つのスレッドが2ステップ目の加算を実行する可能性がある場合、加算の結果データはまだメモリに書き込まれておらず、後のスレッドはcountを読み出す操作を行っているが、countメモリの中のデータは最新のデータではなく、前のデータを加算していないため、データの非対称性を招く.それによって失敗した結果もある.
synchronizedを使用すると、この問題をうまく解決することができます.
同時プログラミングでスレッドセキュリティの問題が発生しました.主な原因は次のとおりです.
キーワードsynchronizedは、同じ時点でメソッドまたはコードブロックを実行できるスレッドが1つしかないことを保証し、synchronizedは、volatileの代わりにスレッドの変化が可視(可視性)であることを保証します.
2.synchronizedの役割
このセグメントコードは、同じ時点で最大1つのスレッドのみが実行されることを保証し、同時セキュリティを保証する効果を達成します.
3.例
消失したリクエスト:2つのスレッドが同時にa++を行い、最終的に予想より少ない結果が得られた.
public class DisappearRequest implements Runnable {
static DisappearRequest instance = new DisappearRequest();
static int i=0;
public static void main(String[] args) throws InterruptedException{
Thread t1 = new Thread(instance);
Thread t2 = new Thread(instance);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}
@Override
public void run() {
for (int j=0;j<100000;j++){
i++;
}
}
}
結果は152093で、指定するたびに結果が異なります.
理由:
Count++は、1つの操作のように見えますが、実際には3つの動作が含まれています.
1.countを読み込む
2.countを1つ追加
3.countの値をメモリに書き込む
マルチスレッドを使用する場合、1つのスレッドが2ステップ目の加算を実行する可能性がある場合、加算の結果データはまだメモリに書き込まれておらず、後のスレッドはcountを読み出す操作を行っているが、countメモリの中のデータは最新のデータではなく、前のデータを加算していないため、データの非対称性を招く.それによって失敗した結果もある.
synchronizedを使用すると、この問題をうまく解決することができます.