ReentrantReadWriteLock Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.
[Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)]
public class ReentrantReadWriteLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Util.Concurrent.Locks.IReadWriteLock
[<Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)>]
type ReentrantReadWriteLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IReadWriteLock
- Warisan
- Atribut
- Penerapan
Keterangan
Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.
Kelas ini memiliki properti berikut:
<ul><li><b>Urutan< akuisisi/b>
Kelas ini tidak memaksakan urutan preferensi pembaca atau penulis untuk akses kunci. Namun, ini mendukung kebijakan kewajaran<>/em< opsional>.
<dl><dt><b>Mode non-adil (default)</b><dd>Ketika dibangun sebagai non-adil (default), urutan entri ke kunci baca dan tulis tidak ditentukan, tunduk pada batasan reentransi. Kunci nonfair yang terus dipertahankan dapat menunda satu atau beberapa utas pembaca atau penulis, tetapi biasanya akan memiliki throughput yang lebih tinggi daripada kunci yang adil.
<dt><b> Mode </b><dd>Ketika dibangun sebagai adil, utas bersaing untuk masuk menggunakan kebijakan sekitar pesanan kedatangan. Ketika kunci yang saat ini ditahan dirilis, utas penulis tunggal yang menunggu terpanjang akan diberi kunci tulis, atau jika ada sekelompok utas pembaca yang menunggu lebih lama dari semua utas penulis yang menunggu, grup tersebut akan diberi kunci baca.
Utas yang mencoba memperoleh kunci baca yang adil (tidak masuk kembali) akan memblokir jika kunci tulis ditahan, atau ada utas penulis yang menunggu. Utas tidak akan memperoleh kunci baca sampai setelah utas penulis tertua yang saat ini menunggu telah diperoleh dan melepaskan kunci tulis. Tentu saja, jika penulis menunggu meninggalkan tunggunya, meninggalkan satu atau beberapa utas pembaca sebagai pelayan terpanjang dalam antrean dengan kunci tulis gratis, maka pembaca tersebut akan diberi kunci baca.
Utas yang mencoba memperoleh kunci tulis yang adil (tidak masuk kembali) akan memblokir kecuali kunci baca dan kunci tulis gratis (yang menyiratkan tidak ada utas tunggu). (Perhatikan bahwa non-pemblokiran ReadLock#tryLock() dan WriteLock#tryLock() metode tidak mematuhi pengaturan yang adil ini dan akan segera memperoleh kunci jika memungkinkan, terlepas dari alur tunggu.) </dl>
<li><b>Reentrancy</b>
Kunci ini memungkinkan pembaca dan penulis untuk memperoleh kembali kunci baca atau tulis dengan gaya ReentrantLock. Pembaca yang tidak masuk kembali tidak diizinkan sampai semua kunci tulis yang dipegang oleh utas tulis telah dirilis.
Selain itu, penulis dapat memperoleh kunci baca, tetapi tidak sebaliknya. Di antara aplikasi lain, reentrancy dapat berguna ketika kunci tulis ditahan selama panggilan atau panggilan balik ke metode yang melakukan bacaan di bawah kunci baca. Jika pembaca mencoba memperoleh kunci tulis, itu tidak akan pernah berhasil.
<li><b>Lock downgrading</b>
Reentrancy juga memungkinkan penurunan dari kunci tulis ke kunci baca, dengan memperoleh kunci tulis, lalu kunci baca dan kemudian melepaskan kunci tulis. Namun, memutakhirkan dari kunci baca ke kunci tulis adalah <b>tidak</b> mungkin.
<li><b>Gangguan akuisisi< kunci/b>
Kunci baca dan kunci tulis mendukung gangguan selama akuisisi kunci.
<li><b>Condition support</b>
Kunci tulis menyediakan Condition implementasi yang berulah dengan cara yang sama, sehubungan dengan kunci tulis, seperti Condition implementasi yang disediakan oleh ReentrantLock#newCondition melakukan untuk ReentrantLock. Hal ini Condition , tentu saja, hanya dapat digunakan dengan kunci tulis.
Kunci baca tidak mendukung Condition dan readLock().newCondition() melemparkan UnsupportedOperationException.
<li><b>Instrumentasi</b>
Kelas ini mendukung metode untuk menentukan apakah kunci dipegang atau digabungkan. Metode ini dirancang untuk memantau status sistem, bukan untuk kontrol sinkronisasi. </ul>
Serialisasi kelas ini berperilaku dengan cara yang sama seperti kunci bawaan: kunci deserialisasi dalam keadaan tidak terkunci, terlepas dari statusnya saat diserialisasikan.
<b>Penggunaan sampel.</b> Berikut adalah sketsa kode yang menunjukkan cara melakukan penurunan kunci setelah memperbarui cache (penanganan pengecualian sangat rumit saat menangani beberapa kunci dengan cara yang tidak berlapis):
{@code
class CachedData {
Object data;
boolean cacheValid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...;
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
} finally {
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {
rwl.readLock().unlock();
}
}
}}
ReentrantReadWriteLocks dapat digunakan untuk meningkatkan konkurensi dalam beberapa penggunaan beberapa jenis Koleksi. Ini biasanya bermanfaat hanya ketika koleksi diharapkan besar, diakses oleh lebih banyak utas pembaca daripada utas penulis, dan memerlukan operasi dengan overhead yang melebihi overhead sinkronisasi. Misalnya, berikut adalah kelas menggunakan TreeMap yang diharapkan besar dan diakses secara bersamaan.
{@code
class RWDictionary {
private final Map<String, Data> m = new TreeMap<>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public List<String> allKeys() {
r.lock();
try { return new ArrayList<>(m.keySet()); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}}
<h2>Catatan< Implementasi/h2>
Kunci ini mendukung maksimum 65535 kunci tulis rekursif dan 65535 kunci baca. Upaya untuk melebihi batas ini mengakibatkan Error pelemparan dari metode penguncian.
Ditambahkan dalam 1.5.
Java dokumentasi untuk java.util.concurrent.locks.ReentrantReadWriteLock.
Bagian dari halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Android Open Source Project dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Creative Commons 2.5 Lisensi Atribusi.
Konstruktor
| Nama | Deskripsi |
|---|---|
| ReentrantReadWriteLock() |
Membuat baru |
| ReentrantReadWriteLock(Boolean) |
Membuat baru |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime. |
Properti
| Nama | Deskripsi |
|---|---|
| Class |
Mengembalikan kelas runtime dari . |
| Handle |
Handel ke instans Android yang mendasar. (Diperoleh dari Object) |
| HasQueuedThreads |
Kueri apakah ada utas yang menunggu untuk memperoleh kunci baca atau tulis. |
| IsFair |
Mengembalikan |
| IsWriteLocked |
Kueri jika kunci tulis dipegang oleh utas apa pun. |
| IsWriteLockedByCurrentThread |
Kueri jika kunci tulis dipegang oleh utas saat ini. |
| JniIdentityHashCode |
Mendapatkan kode hash identitas yang ditetapkan ke Java peer ini oleh runtime interop. (Diperoleh dari Object) |
| JniManagedPeerState |
Implementasi |
| JniPeerMembers |
Mendapatkan metadata JNI yang digunakan untuk memanggil anggota peer Java ini. |
| Owner |
Mengembalikan utas yang saat ini memiliki kunci tulis, atau |
| PeerReference |
Mendapatkan referensi objek JNI untuk peer Java ini. (Diperoleh dari Object) |
| QueuedReaderThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk memperoleh kunci baca. |
| QueuedThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk memperoleh kunci baca atau tulis. |
| QueuedWriterThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk memperoleh kunci tulis. |
| QueueLength |
Mengembalikan perkiraan jumlah utas yang menunggu untuk memperoleh kunci baca atau tulis. |
| ReadHoldCount |
Mengkueri jumlah penangguhan baca masuk kembali pada kunci ini oleh utas saat ini. |
| ReadLockCount |
Mengkueri jumlah kunci baca yang disimpan untuk kunci ini. |
| ThresholdClass |
API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda. |
| ThresholdType |
API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda. |
| WriteHoldCount |
Mengkueri jumlah penangguhan penulisan masuk kembali pada kunci ini oleh utas saat ini. |
Metode
| Nama | Deskripsi |
|---|---|
| Clone() |
Membuat dan mengembalikan salinan objek ini. (Diperoleh dari Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Implementasi |
| Dispose() |
Merilis sumber daya yang dipegang oleh rekan Java ini. (Diperoleh dari Object) |
| Dispose(Boolean) |
Merilis sumber daya yang dipegang oleh rekan Java ini. (Diperoleh dari Object) |
| DisposeUnlessReferenced() |
Implementasi |
| Equals(Object) |
Implementasi |
| Equals(Object) |
Menunjukkan apakah beberapa objek lain "sama dengan" yang satu ini. (Diperoleh dari Object) |
| GetHashCode() |
Mengembalikan nilai kode hash untuk objek . (Diperoleh dari Object) |
| GetWaitingThreads(ICondition) |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu pada kondisi tertentu yang terkait dengan kunci tulis. |
| GetWaitQueueLength(ICondition) |
Mengembalikan perkiraan jumlah utas yang menunggu kondisi tertentu yang terkait dengan kunci tulis. |
| HasQueuedThread(Thread) |
Kueri apakah utas yang diberikan sedang menunggu untuk memperoleh kunci baca atau tulis. |
| HasWaiters(ICondition) |
Kueri apakah ada utas yang menunggu pada kondisi tertentu yang terkait dengan kunci tulis. |
| JavaFinalize() |
Dipanggil oleh pengumpul sampah pada objek ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek. (Diperoleh dari Object) |
| Notify() |
Membangunkan satu utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| NotifyAll() |
Membangunkan semua utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| ReadLock() |
Mengembalikan kunci yang digunakan untuk membaca. |
| SetHandle(IntPtr, JniHandleOwnership) |
Mengatur properti Handle. (Diperoleh dari Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Implementasi |
| ToArray<T>() |
Membuat array terkelola dari pembungkus array Java ini. (Diperoleh dari Object) |
| ToString() |
Mengembalikan representasi string objek. (Diperoleh dari Object) |
| UnregisterFromRuntime() |
Membatalkan pendaftaran peer Java ini dari runtime interop. (Diperoleh dari Object) |
| Wait() |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <diberitahu></em> atau <em>terganggu</em>. (Diperoleh dari Object) |
| Wait(Int64, Int32) |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah waktu nyata berlalu. (Diperoleh dari Object) |
| Wait(Int64) |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah waktu nyata berlalu. (Diperoleh dari Object) |
| WriteLock() |
Mengembalikan kunci yang digunakan untuk menulis. |
Implementasi Antarmuka Eksplisit
| Nama | Deskripsi |
|---|---|
| IJavaPeerable.Disposed() |
Implementasi |
| IJavaPeerable.Finalized() |
Implementasi |
| IJavaPeerable.JniObjectReferenceControlBlock |
Implementasi |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Implementasi |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Implementasi |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Implementasi |
| IJavaPeerable.UnregisterFromRuntime() |
Implementasi |
Metode Ekstensi
| Nama | Deskripsi |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Mendapatkan nama JNI dari jenis instans |
| JavaAs<TResult>(IJavaPeerable) |
Cobalah untuk memaksa |
| JavaCast<TResult>(IJavaObject) |
Melakukan konversi jenis yang diperiksa runtime Android. |
| JavaCast<TResult>(IJavaObject) |
Implementasi |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Cobalah untuk memaksa |