Existe um cenário único (que não seja a compatibilidade com JVMs antigas) em que o uso synchronized
é preferível ao a Lock
? Alguém pode justificar o uso wait
ou notify
sobre os sistemas mais recentes?
Existe algum algoritmo que deve usar um deles em sua implementação?
Vejo perguntas anteriores que abordaram esse assunto, mas gostaria de levar isso um pouco mais longe e realmente deprecate
elas. Existem muitas armadilhas, armadilhas e advertências que foram resolvidas com as novas instalações. Eu apenas sinto que em breve será hora de marcá-los obsoletos.
java
synchronization
deprecation
OldCurmudgeon
fonte
fonte
Respostas:
Quase certamente não. (Na verdade, do ponto de vista teórico, você deve ser capaz de esperar simular / notificar usando outro java.util.concurrent. . Classes. E sincronizado poderia ser substituído com operações de bloqueio explícitas ... embora você precisa ter o cuidado de desbloqueio em
finally
cláusulas.)No entanto, provavelmente existem algoritmos nos quais a implementação de melhor desempenho em Java envolve o uso direto de sincronizados, com ou sem espera e notificação.
Independentemente da resposta à pergunta anterior, a resposta é definitivamente não.
A espera / notificação pode ser (e geralmente é) usada corretamente. Em Java, a reprovação é reservada para classes e métodos que estão quebrados; isto é, onde o uso continuado deve ser corrigido com urgência. Se a Sun (e agora a Oracle) reprovasse algo tão fundamental e amplamente usado como esperar / notificar, eles estariam criando um sério problema de compatibilidade para grandes quantidades de código legado. Isso não é do interesse de ninguém.
Se você deseja se livrar da sincronização / espera / notificação no seu código, tudo bem. Mas a depreciação exige a reescrita de grandes quantidades de código multiencadeado essencialmente correto, e isso seria uma MAU IDÉIA. Os gerentes corporativos de TI e gerentes de produtos de software odiariam você por sugerir isso ...
Vale a pena ler o que "obsoleto" significa de acordo com a documentação Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
E observe também que estamos falando de coisas obsoletas que são essenciais para a linguagem Java. A preterição
synchronized
tem enormes consequências.fonte
java.util.concurrent
classes util são realmente mais rápidas. Nos bastidores, essas classes conversam diretamente com a VM, onde, quando sincronizadas, instala um bloqueio brusco no objeto no gráfico de objetos e, portanto, afeta o desempenho global.synchronized
et. al. Estou apenas sugerindo a suspensão, que realmente diz apenas que não use isso para o novo código. Eu não sonharia em sugerir um código legado danificado, testado e comprovado, exigindo sua remoção.