Permitindo um método para bloquear seu objeto pai em Java
-
22-07-2019 - |
Pergunta
Existe uma maneira em Java para obter um método para bloqueio (mutex) o objeto que está em?
Eu sei que isso parece confuso, mas basicamente eu wan't um equivelent para esse trecho de C #, mas em Java.
lock(this)
{
// Some code here...
}
Eu fui encarregado de reimplementar uma API escrita em .Net em Java, e eu fui convidado a manter a versão Java como semelhante à versão .Net quanto humanamente possível. Isso não é ajudado pelo fato de que a versão .Net parecia que estava transcrito de um C ++ versão que eu não tenho acesso.
De qualquer forma a linha acima aparece na versão C # e eu preciso de algo que faz o mesmo em Java.
Solução
O equivalente a isso é:
synchronized (this)
{
}
(E não, você não deve geralmente fazê-lo em C # ou Java Prefere bloqueio em referências privada, que nada mais tem acesso a Você pode estar ciente de que já, é claro -.. Mas eu não queria deixar uma resposta sem o aviso:)
Outras dicas
Supondo que o código C ++ é um mutex simples, substituir "bloqueio" com "sincronizado"
synchronized (this)
{
// ...
}
Aqui está o Java Concurrency tutorial para mais informações
Eu recomendo Brian Goetz de " Java Concurrency in Practice ." É um excelente livro.
Pode ser uma coisa boa para manter o bloco sincronizado tão pequeno quanto possível. Usando o modificador sincronizado sobre o método é de grão grosso e às vezes necessário, mas caso contrário, você pode usar outro objeto para fazê-lo que mantém o bloco menor.
Como esta:
public class PrivateLock {
private final Object myLock = new Object();
@GuardedBy("myLock") Widget widget;
void someMethod() {
synchronized (myLock) {
// Access or modify the state of widget
}
}
}
Você também deve olhar para o pacote java.util.concurrent do API (JDK 5.0+) para gerenciamento de concorrência adicional objetos como semáforo, trocador, etc
http: / /java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html