java - AQS中源码疑问
巴扎黑
巴扎黑 2017-04-18 10:48:23
0
3
620

AbstractQueuedSynchronizer类中维护了一个用volatile修饰的state状态,而这个状态有如下的两种修改方法:

  • stateset方法:

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操作能保证线程安全呢?还是我的理解有问题呢?谢谢各位大牛了!

巴扎黑
巴扎黑

membalas semua(3)
小葫芦

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.

左手右手慢动作

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

  1. Bandingkan nilai semasa jangkaan dan nyatakan pembolehubah Jika ia adalah sama, teruskan dengan langkah 2. Jika ia berbeza, kaedah tersebut akan tamat.

  2. 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.

Peter_Zhu

Ringkasnya:

  1. Jika anda tidak bergantung pada nilai asal, anda boleh menggunakan set

  2. Jika anda bergantung pada nilai asal, anda boleh menggunakan cas untuk menetapkannya. Ini adalah kunci optimistik itu sendiri.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan