AbstractQueuedSynchronizer 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.
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO).
[Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)]
public abstract class AbstractQueuedSynchronizer : Java.Util.Concurrent.Locks.AbstractOwnableSynchronizer, IDisposable
[<Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)>]
type AbstractQueuedSynchronizer = class
inherit AbstractOwnableSynchronizer
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Warisan
- Atribut
- Penerapan
Keterangan
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). Kelas ini dirancang untuk menjadi dasar yang berguna bagi sebagian besar jenis penyinkron yang mengandalkan satu nilai atom untuk int mewakili status. Subkelas harus menentukan metode yang dilindungi yang mengubah status ini, dan yang menentukan apa arti status tersebut dalam hal objek ini diperoleh atau dirilis. Mengingat ini, metode lain dalam kelas ini melakukan semua mekanisme antrean dan pemblokiran. Subkelas dapat mempertahankan bidang status lain, tetapi hanya nilai yang diperbarui int secara atom yang dimanipulasi menggunakan metode #getState, #setState dan #compareAndSetState dilacak sehubungan dengan sinkronisasi.
Subkelas harus didefinisikan sebagai kelas pembantu internal non-publik yang digunakan untuk mengimplementasikan properti sinkronisasi kelas penutupnya. Kelas AbstractQueuedSynchronizer tidak menerapkan antarmuka sinkronisasi apa pun. Sebaliknya mendefinisikan metode seperti #acquireInterruptibly yang dapat dipanggil sesuai dengan kunci konkret dan sinkronisasi terkait untuk mengimplementasikan metode publik mereka.
Kelas ini mendukung mode eksklusif</em> default <>dan mode <berbagi>/em<.> Ketika diperoleh dalam mode eksklusif, upaya yang diperoleh oleh utas lain tidak dapat berhasil. Mode bersama diperoleh oleh beberapa utas mungkin (tetapi tidak perlu) berhasil. Kelas ini tidak " pahami & perbedaan ini kecuali dalam arti mekanis bahwa ketika mode bersama berhasil diperoleh, utas tunggu berikutnya (jika ada) juga harus menentukan apakah dapat memperolehnya juga. Utas yang menunggu dalam mode yang berbeda berbagi antrean FIFO yang sama. Biasanya, subkelas implementasi hanya mendukung salah satu mode ini, tetapi keduanya dapat mulai bermain misalnya dalam ReadWriteLock. Subkelas yang hanya mendukung mode eksklusif atau hanya bersama tidak perlu menentukan metode yang mendukung mode yang tidak digunakan.
Kelas ini mendefinisikan kelas berlapis ConditionObject yang dapat digunakan sebagai Condition implementasi oleh subkelas yang mendukung mode eksklusif yang metodenya #isHeldExclusively melaporkan apakah sinkronisasi secara eksklusif diadakan sehubungan dengan utas saat ini, metode #release yang dipanggil dengan nilai saat ini #getState sepenuhnya merilis objek ini, dan #acquire, mengingat nilai status tersimpan ini, akhirnya memulihkan objek ini ke status yang diperoleh sebelumnya. Tidak ada AbstractQueuedSynchronizer metode yang membuat kondisi seperti itu, jadi jika batasan ini tidak dapat dipenuhi, jangan gunakan. Perilaku ConditionObject tergantung tentu saja pada semantik implementasi penyinkronnya.
Kelas ini menyediakan metode inspeksi, instrumentasi, dan pemantauan untuk antrean internal, serta metode serupa untuk objek kondisi. Ini dapat diekspor sesuai keinginan ke dalam kelas menggunakan AbstractQueuedSynchronizer untuk mekanika sinkronisasi mereka.
Serialisasi kelas ini hanya menyimpan bilangan bulat atom yang mendasar yang mempertahankan status, sehingga objek yang dideserialisasi memiliki antrean utas kosong. Subkelas umum yang memerlukan serializability akan menentukan readObject metode yang memulihkan ini ke status awal yang diketahui setelah deserialisasi.
<h2>Penggunaan</h2>
Untuk menggunakan kelas ini sebagai dasar penyinkron, tentukan ulang metode berikut, sebagaimana berlaku, dengan memeriksa dan/atau memodifikasi status sinkronisasi menggunakan #getState, #setState dan/atau #compareAndSetState:
<ul><li>#tryAcquire<li>#tryRelease<li>#tryAcquireShared<>#tryReleaseShared<li>#isHeldExclusively</ul>
Masing-masing metode ini secara default melemparkan UnsupportedOperationException. Implementasi metode ini harus aman secara internal, dan secara umum harus pendek dan tidak diblokir. Mendefinisikan metode ini adalah <sarana yang didukung em>saja</em> untuk menggunakan kelas ini. Semua metode lain dideklarasikan final karena tidak dapat bervariasi secara independen.
Anda mungkin juga menemukan metode yang diwariskan dari AbstractOwnableSynchronizer berguna untuk melacak utas yang memiliki penyinkron eksklusif. Anda dianjurkan untuk menggunakannya -- ini memungkinkan alat pemantauan dan diagnostik untuk membantu pengguna dalam menentukan utas mana yang menyimpan kunci.
Meskipun kelas ini didasarkan pada antrean FIFO internal, kelas ini tidak secara otomatis memberlakukan kebijakan akuisisi FIFO. Inti sinkronisasi eksklusif mengambil formulir:
<em>Acquire:</em>
while (!tryAcquire(arg)) {
<em>enqueue thread if it is not already queued</em>;
<em>possibly block current thread</em>;
}
<em>Release:</em>
if (tryRelease(arg))
<em>unblock the first queued thread</em>;
(Mode bersama serupa tetapi mungkin melibatkan sinyal berkala.)
Karena pemeriksaan dalam perolehan dipanggil sebelum mengantre, utas yang baru diperoleh dapat <mendongkrak></em> di depan orang lain yang diblokir dan diantrekan. Namun, Anda dapat, jika diinginkan, mendefinisikan tryAcquire dan/atau tryAcquireShared menonaktifkan pembobotan dengan secara internal memanggil satu atau beberapa metode inspeksi, sehingga memberikan<> urutan akuisisi FIFO adil</em>. Secara khusus, sebagian besar penyinkron yang adil dapat menentukan tryAcquire untuk mengembalikan false jika #hasQueuedPredecessors (metode yang dirancang khusus untuk digunakan oleh penyinkron yang adil) mengembalikan true. Variasi lain dimungkinkan.
Throughput dan skalabilitas umumnya tertinggi untuk barging default (juga dikenal sebagai <em>serakah</em>, <em>renouncement</em>, dan <em>convoy-avoidance</em>) strategi. Meskipun ini tidak dijamin adil atau bebas kelaparan, utas antrean sebelumnya diizinkan untuk direkonsiliasi sebelum utas yang diantrekan kemudian, dan setiap rekontensi memiliki peluang yang tidak bias untuk berhasil melawan utas yang masuk. Selain itu, sementara akuisisi tidak " spin" dalam arti biasa, mereka dapat melakukan beberapa pemanggilan tryAcquire yang diselingi dengan komputasi lain sebelum memblokir. Ini memberikan sebagian besar manfaat spin ketika sinkronisasi eksklusif hanya dipegang secara singkat, tanpa sebagian besar liabilitas ketika tidak. Jika diinginkan, Anda dapat menambah ini dengan panggilan sebelumnya untuk memperoleh metode dengan pemeriksaan "jalur cepat", mungkin melakukan pra-pemeriksaan #hasContended dan/atau #hasQueuedThreads hanya melakukannya jika penyinkron kemungkinan tidak akan digabungkan.
Kelas ini memberikan dasar yang efisien dan dapat diskalakan untuk sinkronisasi sebagian dengan mengkhususkan rentang penggunaannya ke penyinkron yang dapat mengandalkan int parameter status, akuisisi, dan rilis, dan antrean tunggu FIFO internal. Ketika ini tidak cukup, Anda dapat membangun penyinkron dari tingkat yang lebih rendah menggunakan java.util.concurrent.atomic atomic kelas, kelas kustom java.util.Queue Anda sendiri, dan LockSupport memblokir dukungan.
<h2>Contoh< Penggunaan/h2>
Berikut adalah kelas kunci pengecualian bersama yang tidak masuk kembali yang menggunakan nilai nol untuk mewakili status tidak terkunci, dan satu untuk mewakili status terkunci. Meskipun kunci non-reentrant tidak secara ketat memerlukan perekaman utas pemilik saat ini, kelas ini tetap melakukannya untuk membuat penggunaan lebih mudah dipantau. Ini juga mendukung kondisi dan mengekspos beberapa metode instrumentasi:
{@code
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// Acquires the lock if state is zero
public boolean tryAcquire(int acquires) {
assert acquires == 1; // Otherwise unused
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
// Releases the lock by setting state to zero
protected boolean tryRelease(int releases) {
assert releases == 1; // Otherwise unused
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
// Reports whether in locked state
public boolean isLocked() {
return getState() != 0;
}
public boolean isHeldExclusively() {
// a data race, but safe due to out-of-thin-air guarantees
return getExclusiveOwnerThread() == Thread.currentThread();
}
// Provides a Condition
public Condition newCondition() {
return new ConditionObject();
}
// Deserializes properly
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
setState(0); // reset to unlocked state
}
}
// The sync object does all the hard work. We just forward to it.
private final Sync sync = new Sync();
public void lock() { sync.acquire(1); }
public boolean tryLock() { return sync.tryAcquire(1); }
public void unlock() { sync.release(1); }
public Condition newCondition() { return sync.newCondition(); }
public boolean isLocked() { return sync.isLocked(); }
public boolean isHeldByCurrentThread() {
return sync.isHeldExclusively();
}
public boolean hasQueuedThreads() {
return sync.hasQueuedThreads();
}
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
}}
Berikut adalah kelas kait yang seperti java.util.concurrent.CountDownLatch CountDownLatch kecuali hanya memerlukan satu signal untuk menembak. Karena kait tidak eksklusif, kait menggunakan shared metode peroleh dan rilis.
{@code
class BooleanLatch {
private static class Sync extends AbstractQueuedSynchronizer {
boolean isSignalled() { return getState() != 0; }
protected int tryAcquireShared(int ignore) {
return isSignalled() ? 1 : -1;
}
protected boolean tryReleaseShared(int ignore) {
setState(1);
return true;
}
}
private final Sync sync = new Sync();
public boolean isSignalled() { return sync.isSignalled(); }
public void signal() { sync.releaseShared(1); }
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
}}
Ditambahkan dalam 1.5.
Java dokumentasi untuk java.util.concurrent.locks.AbstractQueuedSynchronizer.
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 |
|---|---|
| AbstractQueuedSynchronizer() |
Membuat instans baru |
| AbstractQueuedSynchronizer(IntPtr, JniHandleOwnership) |
Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime. |
Properti
| Nama | Deskripsi |
|---|---|
| Class |
Mengembalikan kelas runtime dari . |
| ExclusiveOwnerThread |
Mengembalikan utas yang terakhir diatur oleh |
| ExclusiveQueuedThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk diperoleh dalam mode eksklusif. |
| FirstQueuedThread |
Mengembalikan utas pertama (menunggu terpanjang) dalam antrean, atau |
| Handle |
Handel ke instans Android yang mendasar. (Diperoleh dari Object) |
| HasContended |
Mengkueri apakah ada utas yang pernah bersaing untuk memperoleh penyinkron ini; artinya, jika metode akuisisi pernah diblokir. |
| HasQueuedPredecessors |
Mengkueri apakah ada utas yang telah menunggu untuk memperoleh lebih lama dari utas saat ini. |
| HasQueuedThreads |
Kueri apakah ada utas yang menunggu untuk diperoleh. |
| IsHeldExclusively |
Mengembalikan jika sinkronisasi ditahan secara eksklusif sehubungan dengan utas |
| JniIdentityHashCode |
Mendapatkan kode hash identitas yang ditetapkan ke Java peer ini oleh runtime interop. (Diperoleh dari Object) |
| JniManagedPeerState |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| JniPeerMembers |
Mendapatkan metadata JNI yang digunakan untuk memanggil anggota peer Java ini. |
| PeerReference |
Mendapatkan referensi objek JNI untuk peer Java ini. (Diperoleh dari Object) |
| QueuedThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk diperoleh. |
| QueueLength |
Mengembalikan perkiraan jumlah utas yang menunggu untuk diperoleh. |
| SharedQueuedThreads |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk diperoleh dalam mode bersama. |
| State |
Mengembalikan nilai status sinkronisasi saat ini. -or- Mengatur nilai status sinkronisasi. |
| 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. |
Metode
| Nama | Deskripsi |
|---|---|
| Acquire(Int32) |
Memperoleh dalam mode eksklusif, mengabaikan gangguan. |
| AcquireInterruptibly(Int32) |
Memperoleh dalam mode eksklusif, membatalkan jika terganggu. |
| AcquireShared(Int32) |
Memperoleh dalam mode bersama, mengabaikan gangguan. |
| AcquireSharedInterruptibly(Int32) |
Memperoleh dalam mode bersama, membatalkan jika terganggu. |
| Clone() |
Membuat dan mengembalikan salinan objek ini. (Diperoleh dari Object) |
| CompareAndSetState(Int32, Int32) |
Secara atomis mengatur status sinkronisasi ke nilai yang diperbarui yang diberikan jika nilai status saat ini sama dengan nilai yang diharapkan. |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (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() |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| Equals(Object) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (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(AbstractQueuedSynchronizer+ConditionObject) |
Mengembalikan koleksi yang berisi utas yang mungkin menunggu kondisi tertentu yang terkait dengan penyinkron ini. |
| GetWaitQueueLength(AbstractQueuedSynchronizer+ConditionObject) |
Mengembalikan perkiraan jumlah utas yang menunggu kondisi tertentu yang terkait dengan penyinkron ini. |
| HasWaiters(AbstractQueuedSynchronizer+ConditionObject) |
Kueri apakah ada utas yang menunggu pada kondisi yang diberikan yang terkait dengan penyinkron ini. |
| IsQueued(Thread) |
Mengembalikan true jika utas yang diberikan saat ini diantrekan. |
| 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) |
| Owns(AbstractQueuedSynchronizer+ConditionObject) |
Kueri apakah ConditionObject yang diberikan menggunakan penyinkron ini sebagai kuncinya. |
| Release(Int32) |
Rilis dalam mode eksklusif. |
| ReleaseShared(Int32) |
Rilis dalam mode bersama. |
| SetHandle(IntPtr, JniHandleOwnership) |
Mengatur properti Handle. (Diperoleh dari Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| ToArray<T>() |
Membuat array terkelola dari pembungkus array Java ini. (Diperoleh dari Object) |
| ToString() |
Mengembalikan representasi string objek. (Diperoleh dari Object) |
| TryAcquire(Int32) |
Upaya untuk memperoleh dalam mode eksklusif. |
| TryAcquireNanos(Int32, Int64) |
Mencoba untuk memperoleh dalam mode eksklusif, membatalkan jika terganggu, dan gagal jika batas waktu yang diberikan berlalu. |
| TryAcquireShared(Int32) |
Upaya untuk memperoleh dalam mode berbagi. |
| TryAcquireSharedNanos(Int32, Int64) |
Mencoba untuk memperoleh dalam mode bersama, membatalkan jika terganggu, dan gagal jika batas waktu yang diberikan berlalu. |
| TryRelease(Int32) |
Upaya untuk mengatur status untuk mencerminkan rilis dalam mode eksklusif. |
| TryReleaseShared(Int32) |
Mencoba mengatur status untuk mencerminkan rilis dalam mode bersama. |
| 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) |
Implementasi Antarmuka Eksplisit
| Nama | Deskripsi |
|---|---|
| IJavaPeerable.Disposed() |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.Finalized() |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). (Diperoleh dari JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). |
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) |
Menyediakan kerangka kerja untuk menerapkan kunci pemblokiran dan sinkronisasi terkait (semaphores, peristiwa, dll) yang mengandalkan antrean tunggu first-in-first-out (FIFO). |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Cobalah untuk memaksa |