Semaphore Kelas

Definisi

Sebuah semaphore penghitungan.

[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)>]
type Semaphore = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Warisan
Atribut
Penerapan

Keterangan

Sebuah semaphore penghitungan. Secara konseptual, semaphore mempertahankan satu set izin. Setiap #acquire blok jika perlu sampai izin tersedia, dan kemudian mengambilnya. Masing-masing #release menambahkan izin, berpotensi merilis acquirer pemblokiran. Namun, tidak ada objek izin aktual yang digunakan; Semaphore hanya menyimpan hitungan jumlah yang tersedia dan bertindak sesuai.

Semaphores sering digunakan untuk membatasi jumlah utas daripada dapat mengakses beberapa sumber daya (fisik atau logis). Misalnya, berikut adalah kelas yang menggunakan semaphore untuk mengontrol akses ke kumpulan item:

{@code
            class Pool {
              private static final int MAX_AVAILABLE = 100;
              private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

              public Object getItem() throws InterruptedException {
                available.acquire();
                return getNextAvailableItem();
              }

              public void putItem(Object x) {
                if (markAsUnused(x))
                  available.release();
              }

              // Not a particularly efficient data structure; just for demo

              protected Object[] items = ...; // whatever kinds of items being managed
              protected boolean[] used = new boolean[MAX_AVAILABLE];

              protected synchronized Object getNextAvailableItem() {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (!used[i]) {
                    used[i] = true;
                    return items[i];
                  }
                }
                return null; // not reached
              }

              protected synchronized boolean markAsUnused(Object item) {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (item == items[i]) {
                    if (used[i]) {
                      used[i] = false;
                      return true;
                    } else
                      return false;
                  }
                }
                return false;
              }
            }}

Sebelum mendapatkan item, setiap utas harus memperoleh izin dari semaphore, menjamin bahwa item tersedia untuk digunakan. Ketika utas telah selesai dengan item yang dikembalikan ke kumpulan dan izin dikembalikan ke semaphore, memungkinkan utas lain untuk memperoleh item tersebut. Perhatikan bahwa tidak ada kunci sinkronisasi yang ditahan ketika #acquire dipanggil karena akan mencegah item dikembalikan ke kumpulan. Semaphore merangkum sinkronisasi yang diperlukan untuk membatasi akses ke kumpulan, secara terpisah dari sinkronisasi apa pun yang diperlukan untuk menjaga konsistensi kumpulan itu sendiri.

Semaphore yang diinisialisasi ke satu, dan yang digunakan sehingga hanya memiliki paling banyak satu izin yang tersedia, dapat berfungsi sebagai kunci pengecualian bersama. Ini lebih dikenal sebagai <em>biner semaphore</em>, karena hanya memiliki dua status: satu izin tersedia, atau nol izin yang tersedia. Ketika digunakan dengan cara ini, semaphore biner memiliki properti (tidak seperti banyak java.util.concurrent.locks.Lock implementasi), bahwa " kunci & dapat dirilis oleh utas selain pemilik (karena semaphores tidak memiliki gagasan kepemilikan). Ini dapat berguna dalam beberapa konteks khusus, seperti pemulihan kebuntuan.

Konstruktor untuk kelas ini secara opsional menerima <>parameter em fairness</em>. Ketika diatur false, kelas ini tidak menjamin tentang urutan di mana utas memperoleh izin. Secara khusus, <em>barging</em> diizinkan, yaitu, utas yang dipanggil #acquire dapat dialokasikan izin di depan utas yang telah menunggu - secara logis utas baru menempatkan dirinya sendiri di kepala antrean utas tunggu. Ketika kewajaran diatur benar, semaphore menjamin bahwa utas yang memanggil salah #acquire() acquire satu metode dipilih untuk mendapatkan izin dalam urutan pemanggilan metode tersebut diproses (first-in-first-out; FIFO). Perhatikan bahwa pemesanan FIFO selalu berlaku untuk titik eksekusi internal tertentu dalam metode ini. Jadi, dimungkinkan bagi satu utas untuk memanggil acquire di depan yang lain, tetapi mencapai titik pemesanan setelah yang lain, dan demikian pula setelah kembali dari metode . Perhatikan juga bahwa metode untimed #tryAcquire() tryAcquire tidak mematuhi pengaturan kewajaran, tetapi akan mengambil izin apa pun yang tersedia.

Umumnya, semaphores yang digunakan untuk mengontrol akses sumber daya harus diinisialisasi sebagai adil, untuk memastikan bahwa tidak ada utas yang kelaparan dari mengakses sumber daya. Saat menggunakan semaphores untuk jenis kontrol sinkronisasi lainnya, keuntungan throughput dari pemesanan non-adil sering melebihi pertimbangan kewajaran.

Kelas ini juga menyediakan metode kemudahan untuk #acquire(int) acquire dan #release(int) release beberapa izin sekaligus. Metode ini umumnya lebih efisien dan efektif daripada perulangan. Namun, mereka tidak menetapkan urutan preferensi apa pun. Misalnya, jika utas A memanggil ) dan utas s.acquire(3s.acquire(2)B memanggil , dan dua izin tersedia, maka tidak ada jaminan bahwa utas B akan mendapatkannya kecuali perolehannya datang terlebih dahulu dan Semaphore s dalam mode yang adil.

Efek konsistensi memori: Tindakan dalam utas sebelum memanggil metode "rilis" seperti release()<tindakan i>happen-before</i> mengikuti metode "acquire" yang berhasil seperti acquire() di utas lain.

Ditambahkan dalam 1.5.

Java dokumentasi untuk java.util.concurrent.Semaphore.

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
Semaphore(Int32, Boolean)

Semaphore Membuat dengan jumlah izin yang diberikan dan pengaturan kewajaran yang diberikan.

Semaphore(Int32)

Semaphore Membuat dengan jumlah izin yang diberikan dan pengaturan kewajaran yang tidak adil.

Semaphore(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 diperoleh.

IsFair

Mengembalikan true jika semaphore ini memiliki kewajaran yang ditetapkan true.

JniIdentityHashCode

Mendapatkan kode hash identitas yang ditetapkan ke Java peer ini oleh runtime interop.

(Diperoleh dari Object)
JniManagedPeerState

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
JniPeerMembers

Sebuah semaphore penghitungan.

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.

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

Memperoleh izin dari semaphore ini, memblokir hingga satu tersedia, atau utasnya adalah Thread#interupted.

Acquire(Int32)

Memperoleh jumlah izin yang diberikan dari semaphore ini, memblokir hingga semua tersedia, atau utasnya adalah Thread#interupted.

AcquireUninterruptibly()

Memperoleh izin dari semaphore ini, memblokir hingga satu tersedia.

AcquireUninterruptibly(Int32)

Memperoleh jumlah izin yang diberikan dari semaphore ini, memblokir hingga semua tersedia.

AvailablePermits()

Mengembalikan jumlah izin saat ini yang tersedia dalam semaphore ini.

Clone()

Membuat dan mengembalikan salinan objek ini.

(Diperoleh dari Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Sebuah semaphore penghitungan.

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

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
DrainPermits()

Memperoleh dan mengembalikan semua izin yang segera tersedia, atau jika izin negatif tersedia, melepaskannya.

Equals(Object)

Sebuah semaphore penghitungan.

(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)
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)
ReducePermits(Int32)

Menyusutkan jumlah izin yang tersedia dengan pengurangan yang ditunjukkan.

Release()

Merilis izin, mengembalikannya ke semaphore.

Release(Int32)

Merilis jumlah izin yang diberikan, mengembalikannya ke semaphore.

SetHandle(IntPtr, JniHandleOwnership)

Mengatur properti Handle.

(Diperoleh dari Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Sebuah semaphore penghitungan.

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

Memperoleh izin dari semaphore ini, hanya jika ada yang tersedia pada saat pemanggilan.

TryAcquire(Int32, Int64, TimeUnit)

Memperoleh jumlah izin yang diberikan dari semaphore ini, jika semua tersedia dalam waktu tunggu yang diberikan dan utas saat ini belum Thread#interupted.

TryAcquire(Int32)

Memperoleh jumlah izin yang diberikan dari semaphore ini, hanya jika semua tersedia pada saat pemanggilan.

TryAcquire(Int64, TimeUnit)

Memperoleh izin dari semaphore ini, jika ada yang tersedia dalam waktu tunggu yang diberikan dan utas saat ini belum Thread#interupted.

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

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.Finalized()

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Sebuah semaphore penghitungan.

(Diperoleh dari JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Sebuah semaphore penghitungan.

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)

Sebuah semaphore penghitungan.

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

Berlaku untuk