Apakah yang menyebabkan masalah keselamatan berbilang benang Java SE?
阿神
阿神 2017-06-12 09:26:22
0
5
972

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

阿神
阿神

闭关修行中......

membalas semua(5)
大家讲道理

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

刘奇

Susunan panggilan bagi utas adalah tidak dijamin teratur Sebab asasnya terletak pada pertukaran antara utas apabila JVM menyelaraskan sumber.

習慣沉默

Sebab penting ialah CPU menyusun semula arahan untuk meningkatkan kecekapan

我想大声告诉你

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.

黄舟

1. Keterlihatan ingatan
2

Oleh kerana num ialah pembolehubah statik, ia akan disimpan dalam timbunan Apabila kaedah run() dilaksanakan, salinan akan disalin ke tindanan untuk penyimpanan Apabila berbilang benang mengubah suainya, salinan yang sama boleh diperolehi masa yang sama, tetapi Disebabkan susunan pelaksanaan, satu utas mengubah suai dan menulis pembolehubah Walaupun num dalam timbunan telah berubah, utas lain tidak mengetahuinya dan mereka akan terus mengubah suai salinan itu. Kemudian pengubahsuaian ditulis pada timbunan, yang akan menimpa pengubahsuaian benang sebelumnya, yang membawa kepada ketidakkonsistenan keadaan.

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).

Atomicity, memandangkan pelaksanaan sebenar num-- ialah dua operasi, akan ada masalah perintah pelaksanaan. Walaupun saya nyatakan sebelum ini bahawa tidak menentu digunakan untuk memastikan keterlihatan. Walau bagaimanapun, masih terdapat situasi di mana pengubahsuaian ditimpa oleh urutan lain, tetapi peluangnya lebih kecil. Bagaimana untuk memastikan atomicity, anda boleh menggunakan kata kunci yang disegerakkan, mekanisme Kunci, dan kit alat konkurensi JDK, dsb. Untuk situasi ini, penyelesaian paling mudah ialah

private static AtomicInteger num=new AtomicInteger(100);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan