Apakah c # memiliki versi sendiri dari kata kunci "disinkronkan" java?
Yaitu di java itu dapat ditentukan baik untuk fungsi, objek atau blok kode, seperti:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
atau
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
kalimat itu.Jawaban:
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]
:Ini juga dapat digunakan pada pengakses (properti dan acara):
Perhatikan bahwa bidang-seperti peristiwa yang disinkronkan secara default, sedangkan sifat auto-dilaksanakan tidak :
Secara pribadi, saya tidak suka implementasi
MethodImpl
karena menguncithis
atautypeof(Foo)
- yang bertentangan dengan praktik terbaik. Opsi yang disukai adalah menggunakan kunci Anda sendiri: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 ).
sumber
MethodImpl
dan peristiwa seperti lapangan sekarang menghasilkan kode sinkronisasi yang baik, dan tidak perlu lagi menggunakan kunci Anda sendiri.sumber
Tidak. Dalam C #, Anda secara eksplisit
lock
sumber daya yang ingin Anda kerjakan secara sinkron di utas asinkron.lock
membuka blok; itu tidak berfungsi pada level metode.Namun, mekanisme yang mendasarinya serupa karena
lock
bekerja dengan memohonMonitor.Enter
(dan selanjutnyaMonitor.Exit
) pada runtime. Java bekerja dengan cara yang sama, menurut dokumentasi Sun .sumber
synchronized
metode Java pada dasarnyasynchronized (this.getClass())
tidak akan sama pada C # menjadilock(typeof(this))
?synchronized
kata kunci java pada metode lebih seperti :,synchronized(this)
hanya pada metode statis berperilaku seperti itusynchronized(class)
.Perhatikan, dengan jalur penuh garis:
[MethodImpl(MethodImplOptions.Synchronized)]
akan terlihat seperti[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
sumber
using System.Runtime.CompilerServices;
Anda bisa menggunakan
lock
pernyataan itu sebagai gantinya. Saya pikir ini hanya bisa menggantikan versi kedua. Juga, ingat bahwa keduanyasynchronized
danlock
perlu beroperasi pada suatu objek.sumber