Rumah  >  Soal Jawab  >  teks badan

Apakah yang menyebabkan masalah keselamatan berbilang benang Java SE?

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

阿神阿神2686 hari yang lalu939

membalas semua(5)saya akan balas

  • 大家讲道理

    大家讲道理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

    balas
    0
  • 怪我咯

    怪我咯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.

    balas
    0
  • 習慣沉默

    習慣沉默2017-06-12 09:28:22

    Sebab penting ialah CPU menyusun semula arahan untuk meningkatkan kecekapan

    balas
    0
  • 我想大声告诉你

    我想大声告诉你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.

    balas
    0
  • 黄舟

    黄舟2017-06-12 09:28:22

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

    balas
    0
  • Batalbalas