Lock 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.
Catatan
Untuk menggunakan API pratinjau ini, Anda harus mengaktifkan fitur pratinjau di proyek dengan mengatur properti ke EnablePreviewFeatures
True
dalam file proyek Anda. Untuk informasi selengkapnya, lihat https://aka.ms/dotnet-preview-features .
Menyediakan mekanisme untuk mencapai pengecualian bersama di wilayah kode antara utas yang berbeda.
public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
- Warisan
-
Lock
- Atribut
Keterangan
Kelas Lock dapat digunakan untuk menentukan wilayah kode yang memerlukan akses yang saling eksklusif antara utas proses, yang biasa disebut bagian penting, untuk mencegah akses bersamaan ke sumber daya. Lock
dapat dimasukkan dan keluar, di mana wilayah kode antara masuk dan keluar adalah bagian penting yang terkait dengan kunci. Utas yang memasukkan kunci dikatakan menahan atau memiliki kunci sampai keluar dari kunci. Paling banyak satu utas dapat menahan kunci pada waktu tertentu. Utas dapat menahan beberapa kunci. Utas dapat memasukkan kunci beberapa kali sebelum keluar, seperti secara rekursif. Utas yang tidak dapat segera memasukkan kunci dapat menunggu hingga kunci dapat dimasukkan atau hingga batas waktu yang ditentukan kedaluwarsa.
Saat menggunakan Enter metode atau TryEnter untuk memasukkan kunci:
- Pastikan bahwa utas keluar dari Exit kunci bahkan jika terjadi pengecualian, seperti di C# dengan menggunakan
try/finally
blok. - Ketika kunci sedang dimasukkan dan keluar dalam metode C#
async
, pastikan bahwa tidakawait
ada antara masuk dan keluar. Kunci dipegang oleh utas dan kode setelahawait
mungkin berjalan pada utas yang berbeda.
Disarankan untuk menggunakan EnterScope metode dengan konstruksi bahasa yang secara otomatis membuang yang dikembalikan Lock.Scope seperti kata kunci C using
#, atau untuk menggunakan kata kunci C lock
#, karena ini memastikan bahwa kunci keluar dalam kasus yang luar biasa. Pola-pola ini mungkin juga memiliki manfaat performa daripada menggunakan Enter/TryEnter
dan Exit
. Fragmen kode berikut mengilustrasikan berbagai pola untuk memasukkan dan keluar dari kunci.
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
Saat menggunakan kata kunci C# lock
atau mirip dengan memasukkan dan keluar dari kunci, jenis ekspresi harus tepat System.Threading.Lock
. Jika jenis ekspresi adalah hal lain, seperti Object
atau jenis generik seperti T
, implementasi berbeda yang tidak dapat dipertukarkan dapat digunakan sebagai gantinya (seperti Monitor). Untuk informasi selengkapnya, lihat speklet pengkompilasi yang relevan.
Interrupt dapat mengganggu utas yang menunggu untuk memasukkan kunci. Pada utas WINDOWS STA, menunggu kunci memungkinkan pemompaan pesan yang dapat menjalankan kode lain pada utas yang sama selama menunggu. Beberapa fitur tunggu dapat ditimpa oleh kustom SynchronizationContext.
Catatan
Utas yang memasukkan kunci, termasuk beberapa kali seperti secara rekursif, harus keluar dari kunci berapa kali yang sama untuk sepenuhnya keluar dari kunci dan memungkinkan utas lain memasuki kunci. Jika utas keluar saat memegang Lock
, perilaku Lock
menjadi tidak terdefinisi.
Perhatian
Jika, pada jalur kode, utas mungkin memasukkan beberapa kunci sebelum keluar, pastikan bahwa semua jalur kode yang mungkin memasukkan dua kunci tersebut pada utas yang sama memasukkannya dalam urutan yang sama. Jika tidak, itu bisa menyebabkan kebuntuan. Misalnya, pertimbangkan bahwa pada satu alur T1
jalur kode masukkan kunci L1
lalu kunci L2
sebelum keluar dari keduanya, dan pada utas T2
jalur kode lain memasukkan kedua kunci dalam urutan terbalik. Dalam skenario itu, dimungkinkan untuk terjadinya urutan peristiwa berikut: memasukkan , memasukkan , mencoba memasukkan L2
dan menunggu, T2
mencoba memasukkan L1
dan menunggu. T1
L2
T2
L1
T1
Ada kebuntuan antara T1
dan T2
yang tidak dapat diselesaikan, dan utas lain yang mencoba memasukkan salah satu kunci di masa depan juga akan menggantung.
Konstruktor
Lock() |
Menginisialisasi instans baru kelas Lock. |
Properti
IsHeldByCurrentThread |
Mendapatkan nilai yang menunjukkan apakah kunci dipegang oleh utas saat ini. |
Metode
Enter() |
Memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan. |
EnterScope() |
Memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan. |
Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
Exit() |
Keluar dari kunci. |
GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
GetType() |
Mendapatkan dari instans Type saat ini. (Diperoleh dari Object) |
MemberwiseClone() |
Membuat salinan dangkal dari saat ini Object. (Diperoleh dari Object) |
ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |
TryEnter() |
Mencoba memasukkan kunci tanpa menunggu. |
TryEnter(Int32) |
Mencoba memasukkan kunci, menunggu jika perlu untuk jumlah milidetik yang ditentukan hingga kunci dapat dimasukkan. |
TryEnter(TimeSpan) |
Mencoba memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan atau sampai batas waktu yang ditentukan kedaluwarsa. |