Есть ли у c # собственная версия ключевого слова "synchronized" в Java?
То есть в Java это может быть указано либо для функции, объекта или блока кода, например так:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
или
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
строчку.Ответы:
Во-первых, большинство классов никогда не должно быть поточно-ориентированным. Используйте YAGNI : применяйте потокобезопасность только тогда, когда вы знаете, что на самом деле собираетесь его использовать (и тестировать).
Для вещей уровня метода есть
[MethodImpl]
:Это также может быть использовано на методах доступа (свойства и события):
Обратите внимание , что поля , как события будут синхронизированы по умолчанию, в то время как автоматический Реализуемое свойство не является :
Лично мне не нравится реализация
MethodImpl
блокировокthis
илиtypeof(Foo)
- что противоречит наилучшей практике. Предпочтительным вариантом является использование ваших собственных замков:Обратите внимание, что для событий, подобных полям, реализация блокировки зависит от компилятора; в более старых компиляторах Microsoft это
lock(this)
/lock(Type)
- однако, в более поздних компиляторах он используетInterlocked
обновления - так что потокобезопасен без неприятных частей.Это позволяет более детально использовать и использовать
Monitor.Wait
/Monitor.Pulse
etc для связи между потоками.Связанная запись в блоге (позже повторно ).
источник
MethodImpl
и полевые события теперь генерируют хороший код синхронизации, и вам больше не нужно использовать собственные блокировки.источник
Нет. В C # вы явно указываете
lock
ресурсы, с которыми хотите работать синхронно в асинхронных потоках.lock
открывает блок; это не работает на уровне метода.Однако основной механизм аналогичен, поскольку
lock
работает, вызываяMonitor.Enter
(и впоследствииMonitor.Exit
) во время выполнения. Java работает точно так же, в соответствии с документацией Sun .источник
synchronized
метод Java в принципеsynchronized (this.getClass())
не похож на C #lock(typeof(this))
?synchronized
ключевое слово java для метода больше похоже на:synchronized(this)
только для статического метода оно ведет себя какsynchronized(class)
.Обратите внимание, с полными путями строка:
[MethodImpl(MethodImplOptions.Synchronized)]
должна выглядеть так[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
источник
using System.Runtime.CompilerServices;
Вы можете использовать
lock
заявление вместо этого. Я думаю, что это может заменить только второй вариант. Также помните, что обоимsynchronized
иlock
нужно оперировать объектом.источник