Tidak aman adalah landasan operasi bebas kunci Java, dan mereka sangat diperlukan di kelas konkurensi bebas kunci. Misalnya, concurrhenthmap dan concurrentlinkedqueue semuanya diimplementasikan oleh kelas yang tidak aman. Dibandingkan dengan kunci di Java, pada dasarnya tidak memiliki overhead dan akan menunggu di tempat. Artikel ini terutama memperkenalkan operasi utama secara tidak aman.
1 compareandswap
/*** Bandingkan nilai di lokasi memori pada offset OBJ dan nilai yang diharapkan, dan perbarui jika sama. Pembaruan ini tidak terganggu. * * @param obj Object that needs to be updated* @param offset The offset of the integer field in obj* @param expect The value that is expected in the field* @param update If the expected value expect is the same as the current value of the field, set the value of filed to this new value* @return If the value of field is changed, return true*/public native boolean compareAndSwapInt(Object obj, long offset, int expect, int memperbarui);
Ini adalah operasi CAS yang terkenal, yang dibagi menjadi tiga langkah
Keluarga CAS juga mencakup compareandswapobject (), compareandswaplong (), compareandswapint (), dll.
Gunakan contoh klasik dari AtomicInteger untuk menggambarkan:
final publik int getAndadd (int delta) {return unsafe.getAndAddint (this, valueOffset, delta);} // unsafe.getandaddintpublic final int getAndaddint (objek var1, long var2, int var4) {int var5; do { / ** Dapatkan nilai asli* / var5 = this.getIntVolatile (var1, var2); / ** Konfirmasikan bahwa nilai asli belum dimodifikasi oleh utas lain, kemudian lakukan pembaruan var5 + var4 operasi*/} while (! This.c.coeandswapint (var1, var2, var5, var5 + var4)); mengembalikan var5;}2 putorder
/**** Menetapkan nilai bidang integer pada offset yang ditentukan di* objek yang disediakan ke nilai yang diberikan. Ini adalah versi yang dipesan atau malas * dari <code> putintvolatile (objek, panjang, int) </code>, yang * tidak menjamin visibilitas langsung perubahan ke utas * lainnya. Ini hanya sangat berguna di mana bidang integer adalah * <code> volatile </code>, dan dengan demikian diharapkan untuk berubah secara tidak terduga. * * @param obj objek yang berisi bidang untuk memodifikasi. * @param mengimbangi offset bidang integer di dalam <code> obj </code>. * @param nilai nilai baru bidang. ?
Ubah posisi di mana offset objek OBJ diimbangi dengan nilai, karena tidak ada operasi memori di Java, dan operasi yang tidak aman ini hanya melengkapi operasi memori yang tidak memadai. Ini juga dapat digunakan untuk operasi array, seperti concurrenthashmap untuk sejumlah besar penggunaan
Segmen <k, v> s0 = segmen baru <k, v> (loadfactor, (int) (cap * loadfactor), (hashentry <k, v> []) hashentry baru [cap]); Segmen <k, v> [] ss = (segmen <k, v> []) segmen baru [ssize]; // Tulis S0 ke posisi di mana array ditsplasilkan ke 0: ss [0] = s0 unsafe.putorderedObject (ss, sbase, s0); // Memesan Segmen [0]
Perlu dicatat bahwa OBJ perlu diatur ke volatile, jika tidak, itu tidak akan terlihat oleh utas lain.
3 putxxxvolatile
/**** Menetapkan nilai bidang integer pada offset yang ditentukan di* objek yang disediakan ke nilai yang diberikan, dengan semantik toko yang mudah menguap. * * @param obj objek yang berisi bidang untuk memodifikasi. * @param mengimbangi offset bidang integer di dalam <code> obj </code>. * @param nilai nilai baru bidang. */ public void putintvolatile (objek obj, offset panjang, nilai int);
Rasanya sama dengan putorderint, karena harus diatur ke volatile, jika tidak apa gunanya?
Di atas adalah semua poin pengetahuan yang saya bagikan dengan Anda kali ini. Terima kasih atas dukungan Anda ke wulin.com.