AbstractQueuedSynchronizer Kelas

Definisi

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 dengan status sinkronisasi awal nol.

AbstractQueuedSynchronizer(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)
ExclusiveOwnerThread

Mengembalikan utas yang terakhir diatur oleh setExclusiveOwnerThread, atau null jika tidak pernah diatur. -or- Mengatur utas yang saat ini memiliki akses eksklusif.

(Diperoleh dari AbstractOwnableSynchronizer)
ExclusiveQueuedThreads

Mengembalikan koleksi yang berisi utas yang mungkin menunggu untuk diperoleh dalam mode eksklusif.

FirstQueuedThread

Mengembalikan utas pertama (menunggu terpanjang) dalam antrean, atau null jika tidak ada utas yang saat ini diantrekan.

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 true (panggilan) saat ini.

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 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)

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 self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

Berlaku untuk