Czy c # ma własną wersję słowa kluczowego „synchronizowane” java?
Tj. W java można określić funkcję, obiekt lub blok kodu, na przykład:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
lub
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
linii.Odpowiedzi:
Po pierwsze - większość klas nigdy nie musi być bezpieczna dla wątków. Używaj YAGNI : stosuj zabezpieczenie wątków tylko wtedy, gdy wiesz, że faktycznie zamierzasz go użyć (i przetestować).
Dla rzeczy na poziomie metod jest
[MethodImpl]
:Można tego również użyć w akcesoriach (właściwościach i zdarzeniach):
Pamiętaj, że zdarzenia podobne do pól są domyślnie synchronizowane, a właściwości zaimplementowane automatycznie nie są :
Osobiście nie lubię implementacji,
MethodImpl
ponieważ blokujethis
lubtypeof(Foo)
- co jest sprzeczne z najlepszymi praktykami. Preferowaną opcją jest użycie własnych zamków:Należy zauważyć, że w przypadku zdarzeń podobnych do pola implementacja blokowania zależy od kompilatora; w starszych kompilatorach Microsoft jest to
lock(this)
/lock(Type)
- jednak w nowszych kompilatorach używaInterlocked
aktualizacji - więc jest bezpieczne dla wątków bez nieprzyjemnych części.Pozwala to na bardziej szczegółowe użycie i umożliwia użycie
Monitor.Wait
/Monitor.Pulse
etc do komunikacji między wątkami.Powiązany wpis na blogu (później ponownie odwiedzony ).
źródło
MethodImpl
zdarzenia podobne do pola generują teraz dobry kod synchronizacji i nie trzeba już używać własnych blokad.źródło
Nie. W języku C # jawnie
lock
zasoby, na których chcesz pracować synchronicznie między wątkami asynchronicznymi.lock
otwiera blok; nie działa na poziomie metody.Jednak podstawowy mechanizm jest podobny, ponieważ
lock
działa poprzez wywołanieMonitor.Enter
(a następnieMonitor.Exit
) w środowisku wykonawczym. Java działa w ten sam sposób, zgodnie z dokumentacją Sun .źródło
synchronized
metoda Java w zasadziesynchronized (this.getClass())
nie jest podobna na C #lock(typeof(this))
?synchronized
słowo kluczowe java w metodzie jest bardziej podobne:synchronized(this)
tylko w metodzie statycznej zachowuje się jaksynchronized(class)
.Zwróć uwagę, z pełnymi ścieżkami linia:
[MethodImpl(MethodImplOptions.Synchronized)]
powinna wyglądać[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
źródło
using System.Runtime.CompilerServices;
Zamiast tego możesz użyć
lock
instrukcji. Myślę, że to może zastąpić tylko drugą wersję. Należy również pamiętać, że zarównosynchronized
ilock
trzeba działać na obiekcie.źródło