Jawaban:
lock
adalah kata kunci penyusun, bukan kelas atau objek aktual. Ini adalah pembungkus di sekitar fungsionalitas Monitor
kelas dan dirancang untuk Monitor
memudahkan pekerjaan dengan kasus umum.
The Monitor
(dan lock
kata kunci), seperti yang Darin mengatakan, terbatas pada AppDomain
. Terutama karena referensi ke alamat memori (dalam bentuk objek instantiated) diperlukan untuk mengelola "kunci" dan mempertahankan identitasMonitor
The Mutex
, di sisi lain, adalah Net bungkus sekitar sistem operasi membangun, dan dapat digunakan untuk seluruh sistem sinkronisasi, menggunakan tali Data (bukan pointer ke data) sebagai identifier-nya. Dua mutex yang mereferensikan dua string dalam dua alamat memori yang sama sekali berbeda, tetapi memiliki data yang sama , sebenarnya akan menggunakan mutex sistem operasi yang sama.
A Mutex
dapat berupa lokal untuk suatu proses atau seluruh sistem . MSDN :
Mutex terdiri dari dua jenis: mutex lokal, yang tidak disebutkan namanya, dan dinamai sistem mutex. Mutex lokal hanya ada dalam proses Anda.
Selain itu, orang harus berhati-hati - dirinci pada halaman yang sama juga - ketika menggunakan sistem mutex seluruh sistem dengan Layanan Terminal.
Salah satu perbedaan antara Mutex
dan lock
adalah yang Mutex
menggunakan konstruksi tingkat kernel , sehingga sinkronisasi akan selalu memerlukan setidaknya transisi ruang-ruang kernel pengguna.
lock
- yang benar-benar merupakan jalan pintas ke Monitor
kelas , di sisi lain mencoba untuk menghindari mengalokasikan sumber daya kernel dan beralih ke kode kernel (dan karenanya lebih ramping & lebih cepat - jika seseorang harus menemukan konstruksi WinAPI yang menyerupai, itu akan menjadi CriticalSection
).
Perbedaan lainnya adalah apa yang orang lain tunjukkan: nama Mutex
dapat digunakan lintas proses.
Kecuali jika seseorang memiliki kebutuhan khusus atau memerlukan sinkronisasi antar proses, lebih baik tetap berpegang pada lock
(alias Monitor
) ˛
Ada beberapa perbedaan "kecil" lainnya, seperti cara penanganan pengabaian, dll.
Hal yang sama dapat dikatakan tentang ReaderWriterLock
dan ReaderWriterLockSlim
di 3.5, Semaphore
dan yang baru SemaphoreSlim
di. NET 4.0 dll. Memang benar bahwa xxSlim
kelas yang terakhir tidak dapat digunakan sebagai primitif sinkronisasi seluruh sistem, tetapi mereka tidak pernah dimaksudkan untuk - mereka "hanya" dimaksudkan menjadi lebih cepat dan lebih ramah sumber daya.
Saya menggunakan Mutex untuk memeriksa apakah saya sudah memiliki salinan aplikasi yang berjalan di mesin yang sama.
bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);
if (!firstInstance)
{
//another copy of this application running
}
else
{
//run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);
Banyak yang sudah dikatakan, tetapi untuk membuatnya sederhana, ini pendapat saya.
lock -> Mudah digunakan, terbungkus monitor, mengunci utas di AppDomain.
mutex tanpa nama -> mirip dengan penguncian kecuali ruang lingkup penguncian lebih dan itu melintasi AppDomain dalam suatu proses.
Bernama mutex -> ruang lingkup penguncian bahkan lebih dari mutex yang tidak disebutkan namanya dan itu melintasi proses dalam sistem operasi.
Jadi sekarang ada pilihan, Anda harus memilih yang paling cocok dalam kasus Anda.
Mutex adalah proses lintas dan akan ada contoh klasik untuk tidak menjalankan lebih dari satu instance aplikasi.
Contoh ke-2 adalah mengatakan Anda memiliki file dan Anda tidak ingin proses yang berbeda untuk mengakses file yang sama, Anda dapat menerapkan Mutex tetapi ingat satu hal Mutex adalah sistem operasi yang luas dan tidak dapat digunakan antara dua proses jarak jauh.
Kunci adalah cara paling sederhana untuk melindungi bagian dari kode Anda dan itu spesifik appdomain, Anda dapat mengganti kunci dengan Moniter jika Anda ingin sinkronisasi yang lebih terkontrol.
Beberapa perbedaan kecil yang tidak disebutkan dalam jawaban:
Dalam hal menggunakan kunci, Anda dapat yakin bahwa kunci akan dilepaskan ketika pengecualian terjadi di dalam blok kunci.
Itu karena kunci menggunakan monitor di bawah tenda dan dilaksanakan dengan cara ini :
object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
Jadi, bagaimanapun, kunci dilepaskan, dan Anda tidak perlu melepaskannya secara manual (seperti yang akan Anda lakukan untuk mutex).
Untuk Kunci, Anda biasanya menggunakan objek pribadi untuk mengunci (dan harus menggunakan ).
Ini dilakukan karena berbagai alasan. (Info lebih lanjut: lihat jawaban ini dan dokumentasi resmi ).
Jadi, jika ada kunci, Anda tidak dapat (secara tidak sengaja mendapatkan) akses ke objek yang dikunci dari luar dan menyebabkan kerusakan.
Tetapi dalam hal Mutex, Anda dapat, karena memiliki Mutex yang umum dan digunakan dari mana saja.