Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika beberapa utas dapat mengakses properti dan memanggil metode dari satu objek, sangat penting untuk memastikan bahwa akses dan pemanggilan tersebut disinkronkan. Jika tidak, satu utas mungkin mengganggu apa yang dilakukan utas lain, dan objek dapat dibiarkan dalam keadaan tidak valid. Kelas yang anggotanya dilindungi dari gangguan tersebut disebut thread-safe.
.NET menyediakan beberapa strategi untuk menyinkronkan akses ke instans dan anggota statis:
Wilayah kode yang disinkronkan. Anda dapat menggunakan Monitor dukungan kelas atau pengkompilasi untuk kelas ini untuk menyinkronkan hanya blok kode yang membutuhkannya, meningkatkan performa.
Sinkronisasi manual. Anda dapat menggunakan objek sinkronisasi yang disediakan oleh pustaka kelas .NET. Lihat Ikhtisar Primitif Sinkronisasi, yang mencakup pembahasan tentang kelas Monitor.
Konteks tersinkronisasi. Hanya untuk aplikasi .NET Framework, Anda dapat menggunakan SynchronizationAttribute untuk mengaktifkan sinkronisasi otomatis yang sederhana untuk ContextBoundObject objek.
Kelas koleksi dalam namespace System.Collections.Concurrent. Kelas-kelas ini menyediakan operasi penambahan dan penghapusan bawaan yang disinkronkan. Untuk informasi selengkapnya, lihat KoleksiThread-Safe.
Common Language Runtime menyediakan model utas tempat kelas dikelompokkan ke dalam sejumlah kategori yang dapat disinkronkan dengan berbagai cara, bergantung pada kebutuhannya. Tabel berikut ini memperlihatkan dukungan sinkronisasi apa yang disediakan untuk bidang dan metode dengan kategori sinkronisasi tertentu.
| Category | Bidang global | Bidang statis | Metode statis | Bidang instans | Metode instans | Blok kode tertentu |
|---|---|---|---|---|---|---|
| Tidak Ada Sinkronisasi | No | No | No | No | No | No |
| Konteks yang Disinkronkan | No | No | No | Yes | Yes | No |
| Wilayah Kode yang Disinkronkan | No | No | Hanya jika ditandai | No | Hanya jika ditandai | Hanya jika ditandai |
| Sinkronisasi Manual | Manual | Manual | Manual | Manual | Manual | Manual |
Tidak ada sinkronisasi
Ini adalah default untuk objek. Utas apa pun dapat mengakses metode atau bidang apa pun kapan saja. Hanya satu thread pada satu waktu yang boleh mengakses objek-objek ini.
Sinkronisasi manual
Pustaka kelas .NET menyediakan sejumlah kelas untuk menyinkronkan utas. Lihat Gambaran Umum Primitif Sinkronisasi.
Wilayah kode yang disinkronkan
Anda dapat menggunakan Monitor kata kunci kelas atau pengkompilasi untuk menyinkronkan blok kode, metode instans, dan metode statis. Tidak ada dukungan untuk bidang statis yang disinkronkan.
Baik Visual Basic maupun C# mendukung penandaan blok kode dengan kata kunci bahasa tertentu, lock pernyataan dalam C# atau SyncLock pernyataan dalam Visual Basic. Ketika kode dijalankan oleh utas, dilakukan upaya untuk memperoleh kunci. Jika kunci telah diperoleh oleh utas lain, utas akan memblokir hingga kunci tersedia. Ketika utas keluar dari blok kode yang disinkronkan, kunci dilepaskan, tidak peduli bagaimana utas keluar dari blok.
Note
Di .NET 9 dan C# 13 atau yang lebih baru, jika target lock adalah instans System.Threading.Lock khusus, pernyataan lock menggunakan Lock.EnterScope() untuk membuat wilayah tersinkronisasi.
Visual Basic tidak mendukung System.Threading.Lock di SyncLock, jadi terus gunakan SyncLock dengan jenis referensi privat khusus.
Jika lock target bukan instance Lock, dan untuk semua penggunaan SyncLock, kompilator menggunakan Monitor.Enter dan Monitor.Exit. Karena implementasi itu, Anda masih dapat menggunakan metode lain Monitor di wilayah yang disinkronkan.
Anda juga dapat memberi anotasi pada metode dengan MethodImplAttribute dengan nilai MethodImplOptions.Synchronized, yang efeknya sama dengan menggunakan Monitor atau salah satu kata kunci kompiler untuk mengunci seluruh badan metode.
Thread.Interrupt dapat digunakan untuk memutus utas dari operasi pemblokiran seperti menunggu akses ke wilayah kode yang disinkronkan. Thread.Interrupt juga digunakan untuk memecah utas dari operasi seperti Thread.Sleep.
Important
Jangan mengunci jenis — yaitu, typeof(MyType) dalam C#, GetType(MyType) di Visual Basic, atau MyType::typeid di C++ — untuk melindungi static metode (Shared metode dalam Visual Basic). Gunakan objek statis privat sebagai gantinya. Demikian pula, jangan gunakan this dalam C# (Me dalam Visual Basic) untuk mengunci metode instans. Gunakan objek privat sebagai gantinya. Kelas atau instans dapat dikunci oleh kode selain anda sendiri, yang berpotensi menyebabkan kebuntuan atau masalah performa.
Dukungan pengkompilasi
Baik Visual Basic maupun C# mendukung kata kunci bahasa yang menggunakan Monitor.Enter dan Monitor.Exit untuk mengunci objek. Visual Basic mendukung pernyataan SyncLock; C# mendukung pernyataan kunci.
Di kedua kasus, jika terjadi pengecualian di blok kode, kunci yang diperoleh oleh lock atau SyncLock akan dilepaskan secara otomatis. Pengkompilasi C# dan Visual Basic menghasilkan blok try/finally dengan Monitor.Enter di awal blok try, dan Monitor.Exit di blok finally. Jika pengecualian terjadi di dalam blok lock atau SyncLock, penangan finally dijalankan agar Anda dapat melakukan pembersihan yang diperlukan.
Konteks yang Disinkronkan
Hanya dalam aplikasi .NET Framework, Anda dapat menggunakan SynchronizationAttribute pada ContextBoundObject apa pun untuk menyinkronkan semua metode dan bidang instans. Semua objek dalam domain konteks yang sama memiliki kunci yang sama. Beberapa utas diizinkan untuk mengakses metode dan bidang, tetapi hanya satu utas yang diizinkan pada satu waktu.
Baca juga
- SynchronizationAttribute
- Utas dan Pengaluran
- Gambaran Umum Primitif Sinkronisasi
- Pernyataan SyncLock
- Lock Statement