ReentrantReadWriteLock Kelas

Definisi

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
ReentrantReadWriteLock
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 dengan properti pengurutan default (nonfair).

ReentrantReadWriteLock(Boolean)

Membuat baru ReentrantReadWriteLock dengan kebijakan kewajaran yang diberikan.

ReentrantReadWriteLock(IntPtr, JniHandleOwnership)

Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime.

Properti

Nama Deskripsi
Class

Mengembalikan kelas runtime dari .Object

(Diperoleh dari Object)
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 true jika kunci ini memiliki kewajaran yang ditetapkan true.

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 ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
JniPeerMembers

Mendapatkan metadata JNI yang digunakan untuk memanggil anggota peer Java ini.

Owner

Mengembalikan utas yang saat ini memiliki kunci tulis, atau null jika tidak dimiliki.

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 ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
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 ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
Equals(Object)

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
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 ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
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 ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.Finalized()

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

(Diperoleh dari JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

Metode Ekstensi

Nama Deskripsi
GetJniTypeName(IJavaPeerable)

Mendapatkan nama JNI dari jenis instans self.

JavaAs<TResult>(IJavaPeerable)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

JavaCast<TResult>(IJavaObject)

Melakukan konversi jenis yang diperiksa runtime Android.

JavaCast<TResult>(IJavaObject)

Implementasi ReadWriteLock mendukung semantik serupa dengan ReentrantLock.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

Berlaku untuk