O c # tem sua própria versão da palavra-chave "sincronizada" do java?
Ou seja, em java, pode ser especificado para uma função, um objeto ou um bloco de código, assim:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
ou
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
c#
java
multithreading
synchronization
Soraz
fonte
fonte
[MethodImpl(MethodImplOptions.Synchronized)]
frase.Respostas:
Primeiro - a maioria das aulas nunca precisará ser segura para threads. Use YAGNI : aplique a segurança de threads apenas quando você souber que realmente vai usá-lo (e testá-lo).
Para o material no nível do método, existe
[MethodImpl]
:Isso também pode ser usado em acessadores (propriedades e eventos):
Observe que os eventos do tipo campo são sincronizados por padrão, enquanto as propriedades implementadas automaticamente não são :
Pessoalmente, não gosto da implementação de
MethodImpl
como ela bloqueiathis
outypeof(Foo)
- o que é contra as melhores práticas. A opção preferida é usar seus próprios bloqueios:Observe que, para eventos do tipo campo, a implementação de bloqueio depende do compilador; em compiladores mais antigos da Microsoft, é um
lock(this)
/lock(Type)
- no entanto, em compiladores mais recentes, ele usaInterlocked
atualizações -, portanto, são seguros para threads sem as partes desagradáveis.Isso permite um uso mais granular e permite o uso de
Monitor.Wait
/Monitor.Pulse
etc para se comunicar entre os threads.Uma entrada de blog relacionada ( revisitada posteriormente ).
fonte
MethodImpl
e eventos do tipo campo agora geram um bom código de sincronização e não é mais necessário usar seus próprios bloqueios.fonte
Não. No C #, você explicitamente
lock
recursos nos quais deseja trabalhar de forma síncrona em threads assíncronos.lock
abre um bloco; não funciona no nível do método.No entanto, o mecanismo subjacente é semelhante, pois
lock
funciona invocandoMonitor.Enter
(e subseqüentementeMonitor.Exit
) no tempo de execução. Java funciona da mesma maneira, de acordo com a documentação da Sun .fonte
synchronized
método on de Javasynchronized (this.getClass())
não é basicamente o semelhante em C #lock(typeof(this))
?synchronized
palavra-chave java em um método é mais parecida com::synchronized(this)
apenas em um método estático se comportasynchronized(class)
.Tome nota, com caminhos completos da linha:
[MethodImpl(MethodImplOptions.Synchronized)]
deve parecer[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
fonte
using System.Runtime.CompilerServices;
Você pode usar a
lock
instrução. Eu acho que isso só pode substituir a segunda versão. Além disso, lembre-se de que ambossynchronized
elock
precisa operar em um objeto.fonte