Existe algum algoritmo que deve usar um deles em sua implementação?
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.
É hora de descontinuar a sincronização, aguardar e notificar?
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.