


Penemuduga bertanya kepada anda: Adakah anda tahu apa itu masalah ABA?
. 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 MasalahDalam senario-senarioproblem berbilang, di sini adalah sains yang mudah mengenai masalah ABA. A) pada masa yang sama Ini Tiga utas adalah seperti berikut:
Thread 1, nilai jangkaan ialah A, nilai yang akan dikemas kini ialah B 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.;
, 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. 1 Nilai awal ialah 100, nombor versi awal belum diubah suai palsut1拿到的初始版本号:1 t2拿到的初始版本号:1 最新版本号:3 false 当前值:100
Salin selepas log masuk2 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
Salin selepas log masuk多说几句
以上是本期关于CAS领域的一个经典ABA问题的解析,不知道你在实际的工作中有没有遇到过,但是在面试中这块是并发知识考查的重点。如果你还没接触过此类的问题,我的建议是你自己将上面的代码运行一下,结合理论去理解一下ABA问题所带来的问题以及如何解决他,这对你日后的开发工作也是有莫大的帮助的!
Apabila AtomicStampedReference menetapkan nilai objek, kedua-dua nilai objek dan cap status mesti memenuhi nilai yang dijangkakan untuk menulis berjaya.
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pengesahan keselamatan PHP melalui CAS (CentralAuthenticationService) Dengan perkembangan pesat Internet, pengurusan hak pengguna dan pengesahan identiti menjadi semakin penting. Apabila membangunkan aplikasi web, adalah penting untuk melindungi data pengguna dan menghalang capaian yang tidak dibenarkan. Untuk mencapai matlamat ini, kami boleh menggunakan CAS (CentralAuthenticationService) untuk pengesahan keselamatan PHP. CAS

1. Jelaskan bahawa apabila berbilang benang melakukan operasi CAS pada sumber pada masa yang sama, hanya satu benang berjaya, tetapi ia tidak akan menyekat benang lain dan benang lain hanya akan menerima isyarat bahawa operasi itu gagal. Ia boleh dilihat bahawa CAS sebenarnya adalah kunci yang optimistik. 2. Mengikuti kod AtomInteger, kita boleh mendapati sum.misc.Unsafe akhirnya dipanggil. Lihat nama Tidak Selamat, ia adalah kelas tidak selamat yang mengeksploitasi hanya lubang yang betul dalam kelas Java dan peraturan keterlihatan. Demi kelajuan, Unsafe membuat beberapa kompromi pada piawaian keselamatan Java. publicfinalnativebooleancompareAndSwapInt(Objec

Penjelasan CAS: CAS (compareandswap), bandingkan dan tukar. Mekanisme yang boleh menyelesaikan kehilangan prestasi yang disebabkan oleh menggunakan kunci dalam situasi selari berbilang benang Operasi CAS mengandungi tiga operan—lokasi memori (V), nilai asal yang dijangkakan (A) dan nilai baharu (B). Jika nilai lokasi memori sepadan dengan nilai asal yang dijangkakan, pemproses secara automatik mengemas kini lokasi kepada nilai baharu. Jika tidak, pemproses tidak melakukan apa-apa. A thread mendapat nilai num dari memori utama dan beroperasi pada num Apabila menulis nilai, thread akan membandingkan nilai num pertama yang diperolehi dengan nilai num dalam ingatan utama, nilai yang berubah akan menjadi num ditulis ke dalam ingatan utama Jika mereka tidak sama, perbandingan akan digelung sehingga berjaya. Dibuat oleh CAS

Selaras terkunci Bagi kebanyakan pengaturcara (sudah tentu saya pada asasnya salah seorang daripada mereka), pengaturcaraan serentak hampir sama dengan menambah kunci (Mutex) pada struktur data yang berkaitan. Sebagai contoh, jika kita memerlukan tindanan yang menyokong konkurensi, cara paling mudah ialah menambah kunci std::sync::Mutex pada tindanan satu benang. (Arc ditambah untuk membenarkan berbilang benang memiliki pemilikan tindanan) usestd::sync::{Mutex,Arc};#[derive(Clone)]structConcurrentStack{inner:Arc,}implConcurrentStack{pubfnnew()-> Self{

Apa itu CASCAS ialah CompareAndSwap, iaitu, bandingkan dan tukar. Mengapa CAS tidak menggunakan kunci tetapi masih memastikan manipulasi data yang selamat di bawah keadaan serentak Nama sebenarnya menunjukkan prinsip CAS dengan sangat intuitif Proses khusus mengubah suai data adalah seperti berikut: Apabila menggunakan CAS untuk mengendalikan data, nilai asal data dan nilai yang akan diubah suai ialah Hantarkannya kepada kaedah untuk membandingkan sama ada nilai pembolehubah sasaran semasa adalah sama dengan nilai asal yang diluluskan. Jika ia adalah sama, ini bermakna pembolehubah sasaran belum diubah suai oleh utas lain. Ubah suai nilai pembolehubah sasaran secara langsung Jika nilai pembolehubah sasaran berbeza daripada nilai asal, maka buktikan pembolehubah sasaran Ia telah diubah suai oleh pengubahsuaian CAS ini, kita dapat melihat bahawa CAS sebenarnya menjamin pengubahsuaian data yang selamat, tetapi terdapat kes di mana pengubahsuaian gagal.

Dalam program ini, saya mencipta 100 utas, dan setiap utas mengumpul 10,000 operasi pada pembolehubah kongsi inc Jika ia dilaksanakan secara serentak, nilai akhir inc hendaklah 1,000,000, tetapi kita tahu bahawa dalam multi-threading, program dilaksanakan serentak. , iaitu, benang yang berbeza mungkin membaca nilai yang sama dari memori utama pada masa yang sama.

1. Buat projek springboot baharu dan perkenalkan dependency org.jasig.cas.clientcas-client-support-springboot3.6.22 Konfigurasikan @EnableCasClient anotasi packagecom.codetiler.demo;importorg.jasig.cas.client.boot.configuration. EnableCasClient;importorg. springframework.boot.SpringApplication;importorg.spring

Isu ini adalah mengenai analisis masalah ABA klasik dalam bidang CAS Saya tidak tahu sama ada anda pernah menemuinya dalam kerja sebenar, tetapi ini adalah fokus ujian pengetahuan serentak dalam temu bual. Jika anda tidak menemui masalah seperti ini, cadangan saya adalah untuk menjalankan sendiri kod di atas.
