Existe-t-il un seul scénario (autre que la compatibilité avec les anciennes machines virtuelles Java) où l'utilisation synchronized
est préférable à l'utilisation d'un Lock
? Quelqu'un peut-il justifier l'utilisation wait
ou l' utilisation notify
des nouveaux systèmes?
Existe-t-il un algorithme qui doit utiliser l'un d'eux dans sa mise en œuvre?
Je vois une question précédente qui touchait à cette question, mais je voudrais aller un peu plus loin et en fait deprecate
les. Il y a beaucoup trop de pièges, d'écueils et de mises en garde qui ont été résolus avec les nouvelles installations. J'ai juste l'impression qu'il serait peut-être bientôt temps de les marquer comme obsolètes.
java
synchronization
deprecation
OldCurmudgeon
la source
la source
Réponses:
Certainement pas. ( En effet, du point de vue théorique, vous devriez être en mesure de simuler attente / notify à l' aide d' autres java.util.concurrent. . Classes. Et synchronisées pourrait être remplacé par Lock explicites opérations ... mais vous devez être prudent pour déverrouiller en
finally
clauses.)Cependant, il existe probablement des algorithmes où l'implémentation la plus performante en Java implique l'utilisation directe de synchronisé, avec ou sans attente et notification.
Quelle que soit la réponse à la question précédente, la réponse est définitivement non.
L'attente / notification peut être (et est souvent) utilisée correctement. En Java, la dépréciation est réservée aux classes et méthodes qui sont cassées; c'est-à-dire lorsque l'utilisation continue doit être corrigée de toute urgence. Si Sun (et maintenant Oracle) déconseillait quelque chose d'aussi fondamental et aussi largement utilisé que l'attente / la notification, cela créerait un grave problème de compatibilité pour d'énormes quantités de code hérité. Ce n'est dans l'intérêt de personne.
Si vous voulez vous débarrasser de synchronized / wait / notify dans votre code, c'est très bien. Mais la dépréciation appelle la réécriture de grandes quantités de code multithread essentiellement correct, et ce serait une MAUVAISE IDÉE. Les responsables informatiques et les responsables de produits logiciels vous détesteraient de l' avoir suggéré ...
Il vaut la peine de lire ce que signifie "obsolète" selon la documentation Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
Et notez également que nous parlons de déprécier des éléments qui sont au cœur du langage Java. La dépréciation
synchronized
a d'énormes conséquences.la source
java.util.concurrent
classes util sont en fait plus rapides. Dans les coulisses, ces classes parlent directement à la machine virtuelle, où une synchronisation installe un verrou contondant sur l'objet dans le graphique d'objet et affecte ainsi les performances globales.synchronized
et. Al. Je suggère simplement la dépréciation, ce qui ne dit vraiment que de ne pas l'utiliser pour le nouveau code. Je ne rêverais pas de suggérer des codes hérités éprouvés et éprouvés en exigeant leur suppression.