Rumah > Soal Jawab > teks badan
在AbstractQueuedSynchronizer
类中维护了一个用volatile
修饰的state
状态,而这个状态有如下的两种修改方法:
state
的set
方法:
protected final void setState(int newState) {
state = newState;
}
CAS
方法:
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
那么,我的疑问来了,不是说volatile
修饰的变量在多线程的单操作中,能够保证其写后读的可见性,即能保证线程安全,为什么还提供了CAS
操作能保证线程安全呢?还是我的理解有问题呢?谢谢各位大牛了!
高洛峰2017-04-18 10:50:23
Tiada percanggahan setState hanyalah operasi tulis dan tidak mengambil berat tentang keadaan asal Contohnya, keadaan asalnya 0. Thread 1 dan thread 2 masing-masing membaca nilai 0. dan kemudian benang 2 merancang untuk menetapkannya kepada 2, yang boleh berjaya Walaupun keadaan sudah 1 dan utas 2 juga mengetahuinya, ia tidak penting untuk menetapkannya kepada 2. Kaedah berikut tidak akan berfungsi.
ringa_lee2017-04-18 10:50:23
Ya, ada masalah dengan pemahaman anda.
Ini tidak bermakna pembolehubah diubah suai meruap boleh memastikan keterlihatan baca-selepas-tulis dalam operasi tunggal berbilang benang, iaitu, keselamatan benang boleh dijamin
Dapat menjamin keterlihatan tidak bermakna keselamatan benang boleh dijamin. Keterlihatan dan keselamatan benang bukanlah konsep yang sama.
operasi cas boleh dibahagikan kepada beberapa operasi kecil
Bandingkan nilai semasa jangkaan dan nyatakan pembolehubah Jika ia adalah sama, teruskan dengan langkah 2. Jika ia berbeza, kaedah tersebut akan tamat.
Tetapkan nilai untuk menyatakan kemas kini
Jika kedua-dua operasi ini dipanggil serentak oleh berbilang benang, akan ada isu keselamatan benang.
Kaedah cas di sini menggunakan arahan cas CPU, yang merupakan operasi atom. Isu konkurensi boleh dielakkan.
天蓬老师2017-04-18 10:50:23
Ringkasnya:
Jika anda tidak bergantung pada nilai asal, anda boleh menggunakan set
Jika anda bergantung pada nilai asal, anda boleh menggunakan cas untuk menetapkannya. Ini adalah kunci optimistik itu sendiri.