Rumah > Soal Jawab > teks badan
Mungkin kod dalam gambar mempunyai kebarangkalian rendah nombor negatif, tetapi jika anda menambah Thread.sleep(10); selepas pernyataan if, anda boleh melihat output nombor negatif
大家讲道理2017-06-12 09:28:22
Saya tidak tahu apa yang anda tanyakan adalah perkara biasa untuk beberapa utas membaca sumber pada masa yang sama dan mengalami masalah tidak disegerakkan Ini kerana satu utas mungkin mendapat nilai semasa satu lagi urutan sedang menulis nilai, yang akan menyebabkan masalah penyegerakan.
Terdapat banyak penyelesaian yang paling bodoh ialah dengan terus menambah penyegerakan pada blok kod dan mengunci keseluruhan kod penyelidikan tentang berbilang benang, anda juga boleh menambah Sangat sedikit kunci menyelesaikan kerja. AtomInteger
怪我咯2017-06-12 09:28:22
Susunan panggilan bagi utas adalah tidak dijamin teratur Sebab asasnya terletak pada pertukaran antara utas apabila JVM menyelaraskan sumber.
習慣沉默2017-06-12 09:28:22
Sebab penting ialah CPU menyusun semula arahan untuk meningkatkan kecekapan
我想大声告诉你2017-06-12 09:28:22
Tiada penyegerakan num Tiada jaminan bahawa selepas utas semasa menukar nilai num, utas lain boleh melihatnya dengan serta-merta.
Ambil kod subjek sebagai contoh Anggapkan bahawa num=1 dilaksanakan hingga akhir, dan tiga utas melaksanakan penghakiman if pada masa yang sama, dan semua boleh menilai untuk lulus, maka nombor negatif mungkin muncul.
黄舟2017-06-12 09:28:22
1. Keterlihatan ingatan
2
Jadi bagaimana jika keselamatan benang dapat dipastikan? Kemudian pastikan bahawa keterlihatan pengubahsuaian kawasan timbunan dijamin sebelum mengubah suai nombor, dan ambil salinan sebelum mengubah suainya (walaupun ia telah diambil sebelum ini. Ini boleh dijamin oleh kata kunci yang tidak menentu).
private static AtomicInteger num=new AtomicInteger(100);