Rumah  >  Artikel  >  Java  >  Penemuduga bertanya kepada anda: Adakah anda tahu apa itu masalah ABA?

Penemuduga bertanya kepada anda: Adakah anda tahu apa itu masalah ABA?

Java学习指南
Java学习指南ke hadapan
2023-07-26 15:09:451180semak imbas

. gundik-gundik yang dikasihi pada masa itu, Gundik Liu dan Gundik Li Mereka semua sedang hamil Jelas sekali sesiapa yang melahirkan anak lelaki akan dapat menjadi istana utama. Gundik Liu sudah lama cemburu, takut Gundik Li akan melahirkan anak lelaki dan dijadikan ratu, maka dia membuat rancangan dengan Guo Huai, pengurus istana, Dutang, dan dengan kerjasama bidan Youshi, Gundik Li mati kerana pengsan darah semasa bersalin Tanpa diduga bulu kucing musang telah dilucutkan, dan ia berdarah dan berkilat dan membawa putera yang baru dilahirkan. Gundik Liu mengarahkan pembantu istana Kou Zhu untuk mencekik putera itu sehingga mati untuk membesarkannya. Selain itu, Zhenzong melihat kucing musang berkulit itu dan menyangka bahawa Gundik Li telah melahirkan seekor raksasa, jadi dia menurunkannya ke istana yang sejuk. Tidak lama kemudian, Gundik Liu bersalin dan melahirkan seorang anak lelaki, yang dijadikan putera raja. Tanpa diduga, enam tahun kemudian, anak Ratu Liu meninggal dunia kerana sakit. Zhenzong tidak lagi mempunyai waris, jadi dia mengambil anak angkat kepada abangnya Baxian Wang (sebenarnya putera raja yang telah digantikan pada tahun itu) sebagai anak angkatnya dan menetapkannya sebagai putera mahkota.

Dapat dilihat dari cerita ini bahawa putera raja telah digantikan oleh kucing musang ketika dia dilahirkan, dan akhirnya kembali menjadi putera raja oleh beberapa kombinasi keadaan yang aneh. Walaupun hasilnya sama, prosesnya berliku-liku, dan putera raja benar-benar bernasib buruk. Kenapa nak cerita ni? Malah, ia mempunyai banyak kaitan dengan isu yang akan kami perkenalkan hari ini. Dengan keputusan yang sama, saya tidak tahu berapa banyak operasi telah berlaku di tengah, jadi bolehkah kita berfikir bahawa ia tidak berubah? Dalam senario perniagaan yang berbeza, kita mesti mempertimbangkan isu ini dengan teliti.

Aba Description Masalah

Dalam senario-senario
problem berbilang, di sini adalah sains yang mudah mengenai masalah ABA. A) pada masa yang sama Ini Tiga utas adalah seperti berikut:

  1. Thread 1, nilai jangkaan ialah A, nilai yang akan dikemas kini ialah B
  2. Thread 2, nilai jangkaan ialah A, nilai yang perlu dikemas kini ialah B

Thread 1 mendapat kepingan masa CPU pertama, manakala utas 2 mendapat kepingan masa CPU dahulu kerana sebab lain Sebabnya disekat Nilai utas 1 dibandingkan dengan nilai jangkaan A. Ia didapati sama dan kemudian nilainya dikemas kini kepada B. Kemudian. pada masa ini, utas 3 muncul, nilai yang dijangkakan ialah B, nilai yang akan dikemas kini ialah A, dan nilai utas 3 adalah sama dengan nilai yang dijangkakan dan jika didapati sama, kemas kini nilai kepada A. Pada masa ini, utas 2 pulih daripada penyekatan dan memperoleh kepingan masa CPU Pada masa ini, nilai utas 2 dibandingkan dengan nilai yang dijangkakan A. Jika didapati sama, nilainya dikemas kini. kepada B. , walaupun utas 2 juga telah menyelesaikan operasi, utas 2 tidak mengetahui bahawa nilai telah melalui proses perubahan A->B->A.

Beri saya contoh khusus

Xiao Ming mengeluarkan 50 yuan dari mesin tunai Disebabkan masalah dengan mesin tunai, terdapat dua benang dan bakinya ditukar daripada 100 kepada 50 pada masa yang sama. masa:

  • Benang 1 (mesin tunai): Dapatkan nilai semasa 100, jangkakan kemas kini kepada 50;
  • Thread 1 berjaya dilaksanakan, Thread 2 disekat atas sebab tertentu; dikemas kini kepada 100. Pada masa ini, utas 3 berjaya dilaksanakan dan bakinya Menjadi 100;
  • Anda boleh lihat pada ketika ini bahawa baki sebenar sepatutnya
  • Ini adalah masalah ABA yang membawa hasil penyerahan yang salah.
  • Penyelesaian
  • Untuk menyelesaikan masalah ABA, anda boleh menambah nombor versi Setiap kali nilai lokasi memori V diubah, nombor versi dinaikkan sebanyak 1
  • Contoh kod objek ference, anda perlu memasukkan nilai awal dan versi awal No.;

    Apabila AtomicStampedReference menetapkan nilai objek, kedua-dua nilai objek dan cap status mesti memenuhi nilai yang dijangkakan untuk menulis berjaya.

    private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<Integer>(100,1);
    
    public static void main(String[] args) {
    //第一个线程
     new Thread(() -> {
      System.out.println("t1拿到的初始版本号:" + atomicStampedReference.getStamp());
      
      //睡眠1秒,是为了让t2线程也拿到同样的初始版本号
      try {
       TimeUnit.SECONDS.sleep(1);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      atomicStampedReference.compareAndSet(100, 101,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);
      atomicStampedReference.compareAndSet(101, 100,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);
     },"t1").start();
     
      // 第二个线程
     new Thread(() -> {
      int stamp = atomicStampedReference.getStamp();
      System.out.println("t2拿到的初始版本号:" + stamp);
      
      //睡眠3秒,是为了让t1线程完成ABA操作
      try {
       TimeUnit.SECONDS.sleep(3);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      System.out.println("最新版本号:" + atomicStampedReference.getStamp());
      System.out.println(atomicStampedReference.compareAndSet(100, 2019,stamp,atomicStampedReference.getStamp() + 1) + "\t当前值:" + atomicStampedReference.getReference());
     },"t2").start();
    }
    e
    1. . Thread t2 Operasi CAS telah selesai Nombor versi terkini telah menjadi 3, yang tidak sama dengan nombor versi 1 yang diperolehi oleh thread t2 sebelum ini. Selesaikan masalah ABA melalui AtomicMarkableReference

    • , Satu-satunya perbezaan antara AtomicMarkableReference ialah ia tidak lagi menggunakan int untuk mengenal pasti rujukan, tetapi menggunakan pembolehubah boolean untuk menunjukkan sama ada pembolehubah rujukan telah diubah.

      t1拿到的初始版本号:1
      t2拿到的初始版本号:1
      最新版本号:3
      false 当前值:100

      1 Nilai awal ialah 100, nombor versi awal belum diubah suai palsu
    • 2 Benang t1 dan t2 mempunyai nombor versi awal yang sama dan belum diubah suai palsu
    • 3 , dan nombor versi telah diubah suai benar
      4 Thread t2 menyelesaikan operasi CAS Nombor versi telah menjadi benar, yang tidak sama dengan nombor versi palsu yang diperolehi oleh thread t2 sebelum ini :

      t1版本号是否被更改:false
      t2版本号是否被更改:false
      是否更改过:true
      false 当前值:100

      多说几句

      以上是本期关于CAS领域的一个经典ABA问题的解析,不知道你在实际的工作中有没有遇到过,但是在面试中这块是并发知识考查的重点。如果你还没接触过此类的问题,我的建议是你自己将上面的代码运行一下,结合理论去理解一下ABA问题所带来的问题以及如何解决他,这对你日后的开发工作也是有莫大的帮助的!

Atas ialah kandungan terperinci Penemuduga bertanya kepada anda: Adakah anda tahu apa itu masalah ABA?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Java学习指南. Jika ada pelanggaran, sila hubungi admin@php.cn Padam