Comment rendre Java.util.Date thread-safe

Pour autant que je sache que java.util.Date est modifiable, il n’est donc pas thread-safe si plusieurs threads tentent d’y accéder et de le modifier. Comment utilisons-nous le locking ou la composition côté client pour le rendre thread-safe?

    Dans cet ordre, du meilleur au pire:

    1. Ne l’utilisez pas du tout, consultez jodatime

    2. Ne l’utilisez pas du tout, utilisez AtomicLong ou immuable primitive long avec volatile pour représenter l’ époque

    3. Encapsulez-le. Toujours renvoyer une copie défensive de Date , jamais une référence à un object interne

    4. Synchroniser sur l’instance Date .

    Vous pouvez utiliser la valeur longue (millisecondes depuis Epoch) à la place d’une instance Date. L’affecter sera une opération atomique et ce sera toujours cohérent.

    Mais votre problème ne réside peut-être pas dans la valeur Date elle-même, mais dans l’ensemble de l’algorithme, ce qui signifie que la vraie réponse serait basée sur votre problème réel.

    Voici un exemple d’opération buggy dans un contexte multithread:

     long time; void add(long duration) { time += duration; } 

    Le problème ici est que vous pouvez avoir deux additions en parallèle ne donnant qu’une addition effective, car le time += duration n’est pas atomique (c’est vraiment le time=time+duration ).

    Utiliser un object long au lieu d’un object mutable n’est pas suffisant. Dans ce cas, vous pouvez résoudre le problème en définissant la fonction comme étant synchronisée, mais dans d’autres cas, elle risque d’être plus délicate.

    La solution la plus simple est de ne jamais modifier une date et de ne jamais la partager. C’est-à-dire, utilisez uniquement Date pour les variables locales.

    Vous pouvez utiliser JodaTime car il contient des objects de date immuables.

    Il n’existe pas de solution simple pour créer un wrapper de classe Date sécurisé pour les threads. Le meilleur moyen est de synchroniser toutes les utilisations de ses objects en utilisant synchronized blocs synchronized .