Bagikan melalui


StampedLock Kelas

Definisi

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

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

Keterangan

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis. Status StampedLock terdiri dari versi dan mode. Metode akuisisi kunci mengembalikan stempel yang mewakili dan mengontrol akses sehubungan dengan status kunci; Versi "coba" dari metode ini dapat mengembalikan nilai khusus nol untuk mewakili kegagalan untuk memperoleh akses. Metode rilis kunci dan konversi memerlukan stempel sebagai argumen, dan gagal jika tidak cocok dengan status kunci. Ketiga mode tersebut adalah:

<Ul>

<li><b>Menulis.</b> Metode #writeLock mungkin memblokir menunggu akses eksklusif, mengembalikan stempel yang dapat digunakan dalam metode #unlockWrite untuk melepaskan kunci. Versi untimed dan timed juga tryWriteLock disediakan. Ketika kunci ditahan dalam mode tulis, tidak ada kunci baca yang dapat diperoleh, dan semua validasi baca optimis akan gagal.

<li><b>Membaca.<Metode /b> #readLock mungkin memblokir menunggu akses non-eksklusif, mengembalikan stempel yang dapat digunakan dalam metode #unlockRead untuk melepaskan kunci. Versi untimed dan timed juga tryReadLock disediakan.

<li><b>Pembacaan Optimis.<Metode /b> #tryOptimisticRead mengembalikan stempel bukan nol hanya jika kunci saat ini tidak disimpan dalam mode tulis. Metode #validate mengembalikan true jika kunci belum diperoleh dalam mode tulis sejak mendapatkan stempel tertentu, dalam hal ini semua tindakan sebelum rilis kunci tulis terbaru terjadi sebelum tindakan mengikuti panggilan ke tryOptimisticRead. Mode ini dapat dianggap sebagai versi kunci baca yang sangat lemah, yang dapat dipecah oleh penulis kapan saja. Penggunaan mode baca optimis untuk segmen kode baca-saja singkat sering mengurangi ketidakcocokan dan meningkatkan throughput. Namun, penggunaannya secara inheren rapuh. Bagian baca optimis hanya boleh membaca bidang dan menahannya dalam variabel lokal untuk digunakan nanti setelah validasi. Bidang yang dibaca saat dalam mode baca optimis mungkin sangat tidak konsisten, sehingga penggunaan hanya berlaku ketika Anda cukup terbiasa dengan representasi data untuk memeriksa konsistensi dan/atau berulang kali memanggil metode validate(). Misalnya, langkah-langkah tersebut biasanya diperlukan saat pertama kali membaca referensi objek atau array, lalu mengakses salah satu bidang, elemen, atau metodenya.

</Ul>

Kelas ini juga mendukung metode yang secara kondisional memberikan konversi di tiga mode. Misalnya, metode #tryConvertToWriteLock mencoba "meningkatkan" mode, mengembalikan stempel tulis yang valid jika (1) sudah dalam mode tulis (2) dalam mode baca dan tidak ada pembaca lain atau (3) dalam mode baca optimis dan kunci tersedia. Bentuk metode ini dirancang untuk membantu mengurangi beberapa kembung kode yang jika tidak terjadi dalam desain berbasis coba lagi.

StampedLocks dirancang untuk digunakan sebagai utilitas internal dalam pengembangan komponen aman utas. Penggunaannya bergantung pada pengetahuan tentang properti internal data, objek, dan metode yang mereka lindungi. Mereka tidak masuk kembali, jadi tubuh terkunci tidak boleh memanggil metode lain yang tidak diketahui yang dapat mencoba memperoleh kembali kunci (meskipun Anda dapat meneruskan stempel ke metode lain yang dapat menggunakan atau mengonversinya). Penggunaan mode kunci baca bergantung pada bagian kode terkait yang bebas efek samping. Bagian baca optimis yang tidak valid tidak dapat memanggil metode yang tidak diketahui untuk mentolerir potensi inkonsistensi. Stempel menggunakan representasi terbatas, dan tidak aman secara kriptografis (yaitu, stempel yang valid mungkin dapat ditebak). Nilai stempel dapat didaur ulang setelah (tidak lebih cepat dari) satu tahun operasi berkelanjutan. Stempel yang disimpan tanpa penggunaan atau validasi lebih lama dari periode ini mungkin gagal divalidasi dengan benar. StampedLocks dapat diserialisasikan, tetapi selalu deserialisasi ke status awal yang tidak terkunci, sehingga tidak berguna untuk penguncian jarak jauh.

Seperti java.util.concurrent.Semaphore Semaphore, tetapi tidak seperti kebanyakan Lock implementasi, StampedLocks tidak memiliki gagasan tentang kepemilikan. Kunci yang diperoleh dalam satu utas dapat dilepaskan atau dikonversi di utas lain.

Kebijakan penjadwalan StampedLock tidak secara konsisten lebih memilih pembaca daripada penulis atau sebaliknya. Semua metode "coba" adalah upaya terbaik dan tidak selalu sesuai dengan kebijakan penjadwalan atau kewajaran apa pun. Pengembalian nol dari metode "coba" apa pun untuk memperoleh atau mengonversi kunci tidak membawa informasi apa pun tentang status kunci; pemanggilan berikutnya mungkin berhasil.

Karena mendukung penggunaan terkoordinasi di beberapa mode kunci, kelas ini tidak secara langsung mengimplementasikan Lock antarmuka atau ReadWriteLock . Namun, StampedLock dapat dilihat #asReadLock(), , #asWriteLock()atau #asReadWriteLock() dalam aplikasi yang hanya memerlukan serangkaian fungsionalitas terkait.

<b>Sinkronisasi Memori.<Metode /b> dengan efek berhasil mengunci dalam mode apa pun memiliki efek sinkronisasi memori yang sama dengan>< tindakan Penguncian</em>, seperti yang dijelaskan dalam Bab 17 dari mengutip>Spesifikasi</kutipan <>Bahasa Java. Metode berhasil membuka kunci dalam mode tulis memiliki efek sinkronisasi memori yang sama dengan <tindakan buka>kunci</em> . Dalam penggunaan baca optimis, tindakan sebelum tindakan buka kunci mode tulis terbaru dijamin terjadi sebelum tindakan mengikuti tryOptimisticRead hanya jika validasi selanjutnya mengembalikan true; jika tidak, tidak ada jaminan bahwa bacaan antara tryOptimisticRead dan validasi dapatkan rekam jepret yang konsisten.

<b>Penggunaan Sampel.</b> Berikut ini menggambarkan beberapa idiom penggunaan di kelas yang mempertahankan titik dua dimensi sederhana. Kode sampel menggambarkan beberapa konvensi coba/tangkap meskipun tidak benar-benar diperlukan di sini karena tidak ada pengecualian yang dapat terjadi di tubuh mereka.

{@code
            class Point {
              private double x, y;
              private final StampedLock sl = new StampedLock();

              // an exclusively locked method
              void move(double deltaX, double deltaY) {
                long stamp = sl.writeLock();
                try {
                  x += deltaX;
                  y += deltaY;
                } finally {
                  sl.unlockWrite(stamp);
                }
              }

              // a read-only method
              // upgrade from optimistic read to read lock
              double distanceFromOrigin() {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.readLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    return Math.hypot(currentX, currentY);
                  }
                } finally {
                  if (StampedLock.isReadLockStamp(stamp))
                    sl.unlockRead(stamp);
                }
              }

              // upgrade from optimistic read to write lock
              void moveIfAtOrigin(double newX, double newY) {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.writeLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    if (currentX != 0.0 || currentY != 0.0)
                      break;
                    stamp = sl.tryConvertToWriteLock(stamp);
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // exclusive access
                    x = newX;
                    y = newY;
                    return;
                  }
                } finally {
                  if (StampedLock.isWriteLockStamp(stamp))
                    sl.unlockWrite(stamp);
                }
              }

              // upgrade read lock to write lock
              void moveIfAtOrigin2(double newX, double newY) {
                long stamp = sl.readLock();
                try {
                  while (x == 0.0 && y == 0.0) {
                    long ws = sl.tryConvertToWriteLock(stamp);
                    if (ws != 0L) {
                      stamp = ws;
                      x = newX;
                      y = newY;
                      break;
                    }
                    else {
                      sl.unlockRead(stamp);
                      stamp = sl.writeLock();
                    }
                  }
                } finally {
                  sl.unlock(stamp);
                }
              }
            }}

Ditambahkan dalam 1.8.

Dokumentasi Java untuk java.util.concurrent.locks.StampedLock.

Bagian halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Proyek Sumber Terbuka Android dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Atribusi Creative Commons 2.5.

Konstruktor

StampedLock()

Membuat kunci baru, awalnya dalam status tidak terkunci.

StampedLock(IntPtr, JniHandleOwnership)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

Properti

Class

Mengembalikan kelas runtime dari .Object

(Diperoleh dari Object)
Handle

Handel ke instans Android yang mendasar.

(Diperoleh dari Object)
IsReadLocked

Mengembalikan true jika kunci saat ini disimpan secara non-eksklusif.

IsWriteLocked

Mengembalikan true jika kunci saat ini disimpan secara eksklusif.

JniIdentityHashCode

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
JniPeerMembers

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

PeerReference

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
ReadLockCount

Mengkueri jumlah kunci baca yang disimpan untuk kunci ini.

ThresholdClass

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

ThresholdType

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

Metode

AsReadLock()

Mengembalikan tampilan biasa Lock dari StampedLock ini di mana Lock#lock metode dipetakan ke #readLock, dan demikian pula untuk metode lain.

AsReadWriteLock()

ReadWriteLock Mengembalikan tampilan StampedLock ini di mana ReadWriteLock#readLock() metode dipetakan ke #asReadLock(), dan ReadWriteLock#writeLock() ke #asWriteLock().

AsWriteLock()

Mengembalikan tampilan biasa Lock dari StampedLock ini di mana Lock#lock metode dipetakan ke #writeLock, dan demikian pula untuk metode lain.

Clone()

Membuat dan mengembalikan salinan objek ini.

(Diperoleh dari Object)
Dispose()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
Dispose(Boolean)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
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)
IsLockStamp(Int64)

Memberi tahu apakah stempel mewakili memegang kunci.

IsOptimisticReadStamp(Int64)

Memberi tahu apakah stempel mewakili pembacaan optimis yang berhasil.

IsReadLockStamp(Int64)

Memberi tahu apakah stempel mewakili memegang kunci secara non-eksklusif.

IsWriteLockStamp(Int64)

Memberi tahu apakah stempel mewakili memegang kunci secara eksklusif.

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

Secara non-eksklusif memperoleh kunci, memblokir jika perlu sampai tersedia.

ReadLockInterruptibly()

Secara non-eksklusif memperoleh kunci, memblokir jika perlu sampai tersedia atau utas saat ini terganggu.

SetHandle(IntPtr, JniHandleOwnership)

Handle Mengatur properti.

(Diperoleh dari Object)
ToArray<T>()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
ToString()

Mengembalikan representasi string objek.

(Diperoleh dari Object)
TryConvertToOptimisticRead(Int64)

Jika status kunci cocok dengan stempel yang diberikan, secara atomik, jika stempel mewakili memegang kunci, melepaskannya dan mengembalikan stempel pengamatan.

TryConvertToReadLock(Int64)

Jika status kunci cocok dengan stempel yang diberikan, secara atom melakukan salah satu tindakan berikut.

TryConvertToWriteLock(Int64)

Jika status kunci cocok dengan stempel yang diberikan, secara atom melakukan salah satu tindakan berikut.

TryOptimisticRead()

Mengembalikan stempel yang nantinya dapat divalidasi, atau nol jika dikunci secara eksklusif.

TryReadLock()

Secara non-eksklusif memperoleh kunci jika segera tersedia.

TryReadLock(Int64, TimeUnit)

Secara non-eksklusif memperoleh kunci jika tersedia dalam waktu tertentu dan utas saat ini belum terganggu.

TryUnlockRead()

Melepaskan satu penangguhan kunci baca jika ditahan, tanpa memerlukan nilai stempel.

TryUnlockWrite()

Melepaskan kunci tulis jika ditahan, tanpa memerlukan nilai stempel.

TryWriteLock()

Secara eksklusif memperoleh kunci jika segera tersedia.

TryWriteLock(Int64, TimeUnit)

Secara eksklusif memperoleh kunci jika tersedia dalam waktu tertentu dan utas saat ini belum terganggu.

Unlock(Int64)

Jika status kunci cocok dengan stempel yang diberikan, melepaskan mode kunci yang sesuai.

UnlockRead(Int64)

Jika status kunci cocok dengan stempel yang diberikan, melepaskan kunci non-eksklusif.

UnlockWrite(Int64)

Jika status kunci cocok dengan stempel yang diberikan, melepaskan kunci eksklusif.

UnregisterFromRuntime()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
Validate(Int64)

Mengembalikan true jika kunci belum diperoleh secara eksklusif sejak penerbitan stempel yang diberikan.

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 real time telah berlalu.

(Diperoleh dari Object)
Wait(Int64)

Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah real time telah berlalu.

(Diperoleh dari Object)
WriteLock()

Secara eksklusif memperoleh kunci, memblokir jika perlu sampai tersedia.

WriteLockInterruptibly()

Secara eksklusif memperoleh kunci, memblokir jika perlu sampai tersedia atau utas saat ini terganggu.

Implementasi Antarmuka Eksplisit

IJavaPeerable.Disposed()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.DisposeUnlessReferenced()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.Finalized()

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.JniManagedPeerState

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

(Diperoleh dari Object)

Metode Ekstensi

JavaCast<TResult>(IJavaObject)

Melakukan konversi jenis yang diperiksa runtime Bahasa Umum Android.

JavaCast<TResult>(IJavaObject)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

GetJniTypeName(IJavaPeerable)

Kunci berbasis kemampuan dengan tiga mode untuk mengontrol akses baca/tulis.

Berlaku untuk