Pertama - sebagian besar kelas tidak perlu thread-safe. Gunakan YAGNI : hanya terapkan keamanan utas saat Anda tahu Anda benar-benar akan menggunakannya (dan mengujinya).
Untuk hal-hal tingkat metode, ada [MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
Ini juga dapat digunakan pada pengakses (properti dan acara):
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
Perhatikan bahwa bidang-seperti peristiwa yang disinkronkan secara default, sedangkan sifat auto-dilaksanakan tidak :
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
Secara pribadi, saya tidak suka implementasi MethodImpl
karena mengunci this
atau typeof(Foo)
- yang bertentangan dengan praktik terbaik. Opsi yang disukai adalah menggunakan kunci Anda sendiri:
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
Perhatikan bahwa untuk kejadian seperti lapangan, implementasi penguncian bergantung pada kompiler; dalam kompiler Microsoft yang lebih lama itu adalah lock(this)
/ lock(Type)
- namun, dalam kompiler yang lebih baru ia menggunakanInterlocked
pembaruan - jadi aman-aman tanpa bagian-bagian yang buruk.
Ini memungkinkan penggunaan yang lebih terperinci, dan memungkinkan penggunaan Monitor.Wait
/ Monitor.Pulse
etc untuk berkomunikasi di antara utas.
Entri blog terkait (nanti ditinjau kembali ).