私はJavaでマルチスレッドを学んでいましたが、このチュートリアルでは、同期を取り除くとバグが発生してしまったとのことでしたので、試してみたところでSystem.out.println(Thread.currentThread().getName() + " " +count);
を試していました。プログラムはうまくいきました。しかし、同期された単語だけが削除され、印刷行(System.out.println(Thread.currentThread().getName() + " " +count);
)が追加されない場合、プログラムはバグが予想されます。System.out.println(Thread.currentThread()。getName()+ "" + count)を使用します。同期につながる
私は、印刷行を追加すると、それは同期させることができる方法を理解することはできません。複数のスレッドが同時にで同じフィールドへのアクセスを試みると、
public class intro implements Runnable {
int n=10000;
private int count = 0;
public int getCount() { return count; }
public synchronized void incrSync() { count++; }
public void run() {
for (int i=0; i<n; i++) {
incrSync();
//System.out.println(Thread.currentThread().getName() + " " +count);
}
}
public static void main(String [] args) {
intro mtc = new intro();
Thread t1 = new Thread(mtc);
Thread t2 = new Thread(mtc);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException ie) {
System.out.println(ie);
ie.printStackTrace();
}
System.out.println("count = "+ mtc.getCount());
}
}
println()が同期しています。そのため、スレッドはロックを取得して解放します。もちろん、コードをスレッドセーフにするためには、それに頼るべきではありません。 –
@JBNizet私はそれへの参照を見つけることができません、あなたは1つを提供してくださいできますか?私はJavaのドキュメントとhttps://stackoverflow.com/a/9459886を確認しました。 – 11thdimension
javadocはメソッド(またはその内部コード)が同期しているかどうかは言及していません。これは実装の詳細です。これはAPIの一部ではありません。しかし、PrintStreamのソースコードはJDKに付属しています。ただそれを見てください。 –