Версия C# синхронизируемого ключевого слова Java?

Vue-router имеет фантастический способ динамического перенаправления / проверок:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // the function receives the target route as the argument
      // return redirect path/location here.
    }}
  ]
})

Вы можете поместить проверки маршрута в эту функцию и выполнить любые необходимые проверки.

Или ... вы можете использовать полную мощность Vue-router reg-exp и записать свой путь в router.js, как этот:

/(clothes|electronics|babies)/*

303
задан Soraz 17 October 2015 в 12:17
поделиться

4 ответа

Сначала - большинство классов никогда не должно будет быть ориентировано на многопотоковое исполнение. Используйте YAGNI: только примените потокобезопасность, когда Вы знаете, что на самом деле собираетесь использовать ее (и протестировать ее).

Для материала уровня метода, существует [MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

Это может также использоваться на средствах доступа (свойства и события):

private int i;
public int SomeProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { return i; }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set { i = value; }
}

Примечание, что подобные полю события , синхронизировалось по умолчанию, в то время как автореализованные свойства не :

public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized

Лично, мне не нравится реализация MethodImpl, поскольку она блокирует this или typeof(Foo) - который является против лучшей практики. Предпочтительный вариант состоит в том, чтобы использовать Ваши собственные блокировки:

private readonly object syncLock = new object();
public void SomeMethod() {
    lock(syncLock) { /* code */ }
}

Примечание, что для подобных полю событий, реализация блокировки зависит от компилятора; в более старых компиляторах Microsoft это lock(this) / lock(Type) - однако, в более свежих компиляторах, которые это использует Interlocked обновления - настолько ориентированный на многопотоковое исполнение без противных частей.

Это позволяет больше детализированного использования и позволяет использованию [1 111] / Monitor.Pulse и т.д. связываться между потоками.

А имел отношение запись в блоге (позже , пересмотрел ).

452
ответ дан Marc Gravell 23 November 2019 в 01:23
поделиться
static object Lock = new object();

lock (Lock) 
{
// do stuff
}
54
ответ дан Jan Gressmann 23 November 2019 в 01:23
поделиться

c# имеет свою собственную версию "синхронизируемого" ключевого слова Java?

номер в C#, Вы явно lock ресурсы, что Вы хотите продолжить работать синхронно через асинхронные потоки. lock открывает блок; это не работает на уровне метода.

Однако базовый механизм подобен с тех пор lock работы путем вызова Monitor.Enter (и впоследствии Monitor.Exit) на времени выполнения. Java работает тот же путь, согласно документация Sun .

39
ответ дан Konrad Rudolph 23 November 2019 в 01:23
поделиться

Можно использовать lock оператор вместо этого. Я думаю, что это может только заменить вторую версию. Кроме того, помните что и synchronized и lock потребность воздействовать на объект.

5
ответ дан James 23 November 2019 в 01:23
поделиться