Sangat umum menggunakan objek hanya baca statis privat untuk mengunci multi threading. Saya memahami bahwa privat mengurangi titik masuk ke objek penguncian dengan memperketat enkapsulasi dan karena itu akses ke yang paling penting.
Tapi kenapa statis?
private static readonly object Locker = new object();
Pada akhirnya, bidang ini hanya digunakan di dalam kelas saya saja, dan saya juga bisa menggunakan ini sebagai gantinya:
private readonly object Locker = new object();
Ada komentar?
MEMPERBARUI:
Sebagai contoh saya telah menempelkan kode ini (hanya contoh). Saya bisa menggunakan loker statis atau non-statis untuk ini dan keduanya akan berfungsi dengan baik. Mempertimbangkan jawaban di bawah ini, saya harus mendefinisikan loker saya seperti ini? (Maaf saya ada wawancara minggu depan dan perlu tahu setiap detail :)
private readonly object Locker = new object();
Dan inilah kodenya:
private int _priceA;
private int _priceB;
private EventWaitHandle[] _waithandle;
private readonly IService _service;
//ctor
public ModuleAViewModel(IService service)
{
_service = service;
_modelA = new ModelA();
_waithandle = new ManualResetEvent[2];
_waithandle[0] = new ManualResetEvent(false);
_waithandle[1] = new ManualResetEvent(false);
LoadDataByThread();
}
private void LoadDataByThread()
{
new Thread(() =>
{
new Thread(() =>
{
lock (Locker)
{
_priceA = _service.GetPriceA();
}
_waithandle[0].Set();
}).Start();
new Thread(() =>
{
lock (Locker)
{
_priceB = _service.GetPriceB();
}
_waithandle[1].Set();
}).Start();
WaitHandle.WaitAll(_waithandle);
PriceA = _priceA;
PriceB = _priceB;
}).Start();
}
Terima kasih
sumber
_service
dan_waithandle
berada? contoh? statis? lain? Itu bisa , misalnya, dengan sengaja menyinkronkan akses ke server jarak jauh ...Jawaban:
Tidaklah "sangat umum untuk menggunakan objek hanya baca statis privat untuk mengunci multi threading" - sebaliknya, menggunakan kunci pada perincian yang sesuai / dipilih adalah hal yang umum . Terkadang memang begitu
static
. Lebih sering, IMO, bukan - tetapi berbasis instance .Waktu utama Anda melihat
static
kunci adalah untuk cache global, atau untuk pemuatan data global / singletons yang ditangguhkan. Dan di kedua, ada cara yang lebih baik untuk melakukannya pula .Jadi itu sangat tergantung: bagaimana
Locker
digunakan dalam skenario Anda? Apakah itu melindungi sesuatu yang dengan sendirinya statis? Jika demikian, kuncinya harus statis. Jika itu melindungi sesuatu yang berbasis instance , maka IMO kunci juga harus berbasis instance.sumber
Tidak harus statis, bahkan terkadang tidak boleh statis.
Variabel harus berada dalam lingkup yang sama dengan metode yang Anda gunakan untuk mengunci. Jika metodenya statis, variabel harus statis, dan jika metodenya adalah metode instan, variabel tersebut harus berupa variabel instan.
Variabel statis akan tetap berfungsi saat digunakan untuk mengunci metode instance, tetapi Anda akan terlalu banyak mengunci. Anda akan mengunci semua metode dalam semua contoh, bukan hanya metode dalam contoh yang sama.
sumber
Cakupan dan masa pakai kunci dapat / harus bergantung pada 'benda' yang ingin Anda kunci. Kunci statis sebagian besar digunakan untuk mengunci benda statis.
sumber