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