Bahagian tambahan siri pengaturcaraan serentak JavaC A S (Banding dan tukar)
, gaya artikel masih penuh dengan gambar dan teks, mudah difahami, membolehkan pembaca berdialog gila dengan penemuduga. C A S(Compare and swap)
,文章风格依然是图文并茂,通俗易懂,让读者们也能与面试官疯狂对线。
C A S
作为并发编程必不可少的基础知识,面试时C A S
也是个高频考点,所以说C A S
是必知必会,本文将带读者们深入理解C A S
C A S code>Sebagai pengetahuan asas penting tentang pengaturcaraan serentak, semasa temu duga<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px; margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>C A S
juga merupakan tapak ujian frekuensi tinggi, jadi C A S
mesti diketahui, artikel ini akan memberi pembaca pemahaman yang mendalamC A S
. 🎜C A S(compareAndSwap)
也叫比较交换,是一种无锁原子算法,映射到操作系统就是一条cmpxchg
硬件汇编指令(保证原子性),其作用是让C P U
将内存值更新为新值,但是有个条件,内存值必须与期望值相同,并且C A S
Operasi tidak memerlukan pertukaran antara mod pengguna dan mod kernel, dan memori dibaca dan ditulis terus dalam mod pengguna (nomeanthreads) penukaran konteks).
它包含3个参数<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color : rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb> C A S(V,E,N)
,V
表示待更新的内存值,E
表示预期值,N
表示新值,当 V
值等于E
值时,才会将V
值更新成N
值,如果V
值和E
值不等,不做更新,这就是一次C A S
的操作。3
个参数C A S(V,E,N)
,V
表示待更新的内存值,E
表示预期值,N
表示新值,当 V
值等于E
值时,才会将V
值更新成N
值,如果V
值和E
值不等,不做更新,这就是一次C A S
的操作。
简单说,C A S
C A S
›象的那样,说明它已经被别人修改过了,你只需要重新读取,设置新期望值,再次尝试修改就好了。🎜Atomicity bermakna satu atau lebih operasi berada dalam C P U
ciri yang tidak boleh diganggu semasa pelaksanaan. Ia sama ada dilaksanakan atau tidak dilaksanakan dan tidak boleh dilaksanakan di tengah (satu yang tidak boleh diganggu atau urutan operasi). C P U
执行的过程中不被中断的特性,要么执行,要不执行,不能执行到一半(不可被中断的一个或一系列操作)。
为了保证C A S
的原子性,C P U
提供了下面两种方式
总线(B U S
)是计算机组件间的传输数据方式,也就是说C P U
与其他组件连接传输数据,就是靠总线完成的,比如C P U
C P U
menyediakan dua kaedah berikut🎜B U S
) ialah kaedah penghantaran data antara komponen komputer, iaituC P U
menyambung dengan komponen lain untuk menghantar data, yang dilakukan dengan bas, seperti C P U
membaca dan menulis memori. 🎜总线锁定是指C P U
使用了总线锁,所谓总线锁就是使用C P U
提供的LOCK#
信号,当C P U
在总线上输出LOCK#
信号时,其他C P U
的总线请求将被阻塞。C P U
使用了总线锁,所谓总线锁就是使用C P U
提供的LOCK#
信号,当C P U
在总线上输出LOCK#
信号时,其他C P U
的总线请求将被阻塞。
总线锁定方式虽然保证了原子性,但是在锁定期间,会导致大量阻塞,增加系统的性能开销,所以现代C P U
为了提升性能,通过锁定范围缩小的思想设计出了缓存行锁定(缓存行是C P U
C P U
为了提升性能,通过锁定范围缩小的思想设了玡凓缓存行是Apa yang dipanggil kunci cache merujuk kepada C P U
mengunci C P U
对缓存行进行锁定,当缓存行中的共享变量回写到内存时,其他C P U
会通过总线嗅探机制感知该共享变量是否发生变化,如果发生变化,让自己对应的共享变量缓存行失效,重新从内存读取最新的数据,缓存锁定是基于缓存一致性机制来实现的,因为缓存一致性机制会阻止两个以上C P U
同时修改同一个共享变量(现代C P U
基本都支持和使用缓存锁定机制)。
C A S
和锁都解决了原子性问题,和锁相比没有阻塞、线程上下文你切换、死锁,所以C A S
要比锁拥有更优越的性能,但是C A S
同样存在缺点。
C A S
garis cache
C P U
akan mengesan sama ada pembolehubah kongsi telah berubah melalui mekanisme menghidu bas. Jika ia perubahan, biarkan dirinya Baris cache pembolehubah kongsi yang sepadan adalah tidak sah dan data terkini dibaca dari memori sekali lagi Penguncian cache dilaksanakan berdasarkan mekanisme ketekalan cache, kerana mekanisme ketekalan cache akan menghalang lebih daripada dua C P U
Ubah suai pembolehubah kongsi yang sama secara serentak (🎜ModenC P UPada asasnya semua Menyokong dan menggunakan mekanisme penguncian cache 🎜). 🎜<h1 data-tool="mdnice editor" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 24px;">
<span style="display: none; "></span>Masalah C A S</h1>🎜<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px; margin- kiri: 2px;warna latar belakang: rgba(27, 31, 35, 0.05);fon-family: " operator mono consolas monaco menlo monospace break-all rgb>C A S
dan kunci kedua-duanya menyelesaikan masalah atomicity. Berbanding dengan kunci, tiada penyekatan, penukaran konteks benang dan kebuntuan, jadi C A S
mempunyai prestasi yang lebih baik daripada kunci, tetapiC A SSama Terdapat kekurangan. 🎜🎜C A S Masalah dengan kod> adalah seperti berikut🎜. ;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">ABA
Soalan Apabila benang gagal memperoleh kunci, ia tidak menyekat dan menggantung, tetapi cuba memperoleh semula selepas tempoh masa ini sehingga ia berjaya jenis pemerolehan gelung Mekanisme ini dipanggil kunci putaran (C A S
hanya boleh digunakan untuk satu pembolehubah kongsi. Jika terdapat berbilang pembolehubah dikongsi, anda hanya boleh menggunakan kunci. Sudah tentu, jika anda Terdapat cara untuk menyepadukan berbilang pembolehubah ke dalam satu pembolehubah, menggunakan C A S
juga bagus, contohnya dalam kunci baca-tulisBit keadaan tinggi dan rendah
.
Masa putaran terlalu lama
kunci putaran
). spinlock
自旋锁好处是,持有锁的线程在短时间内释放锁,那些等待竞争锁的线程就不需进入阻塞状态(无需线程上下文切换/无需用户态与内核态切换),它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取,这样就避免了用户态和内核态的切换消耗。
自旋锁坏处显而易见,线程在长时间内持有锁,等待竞争锁的线程一直自旋,即CPU一直空转,资源浪费在毫无意义的地方,所以一般会限制自旋次数。
最后来说自旋锁的实现,实现自旋锁可以基于C A S
实现,先定义lockValue
对象默认值1
,1
代表锁资源空闲,0
C A S
pelaksanaan, mula-mula takrifkan lockValue
Nilai lalai objek1
,1
bermaksud sumber kunci adalah percuma, 0
bermaksud sumber kunci telah diduduki, kodnya adalah seperti berikut🎜public class SpinLock { //lockValue 默认值1 private AtomicInteger lockValue = new AtomicInteger(1); //自旋获取锁 public void lock(){ // 循环检测尝试获取锁 while (!tryLock()){ // 空转 } } //获取锁 public boolean tryLock(){ // 期望值1,更新值0,更新成功返回true,更新失败返回false return lockValue.compareAndSet(1,0); } //释放锁 public void unLock(){ if(!lockValue.compareAndSet(1,0)){ throw new RuntimeException("释放锁失败"); } } }
Fungsi AtomicInteger
类型的lockValue
变量,AtomicInteger
是Java
基于C A S
实现的Integer
原子操作类,还定义了3个函数lock、tryLock、unLock
tryLock ditakrifkan di atas - dapatkan kunci
. 2px;warna latar belakang: rgba(27, 31, 35, 0.05); keluarga fon: "Operator Mono", Consolas, Monaco, Menlo, monospace;patah perkataan: break-all;warna: rgb(255, 100, 65);">C A S更新LockValue
值相等,则lockValue
值更新为0
,返回 benar
,否则执行下面逻辑C A S
更新lockValue
值相等,则lockValue
值更新为0
,返回true
,否则执行下面逻辑lockValue
值不相等,不做任何更新,返回false
如果期望值与LockValue
值不相等,不做任何更新,返回salah
0
,更新值1
0
,更新值1
C A S
更新lockValue
值相等,则lockValue
值更新为1
,返回true
,否则执行下面逻辑lockValue
值不相等,不做任何更新,返回false
C A S
更新
lockValue
值相等,则lockValue
值更新为1
,返回