À l' heure actuelle dans ma demande, j'utilise var fooSeq: Seq[Foo] = Seq.empty
et puis en utilisant :+
pour ajouter des éléments. Je comprends que cela pourrait conduire à des problèmes et des conditions de course possibles multithreading, mais jusqu'à présent ne l' ai pas eu de problèmes.
J'ai récemment découvert Seq.newBuilder()
et semble que cela pourrait être le meilleur moyen d'utiliser des séquences Scala. Je me demande si la prestation de performance est avantageuse par rapport à l' utilisation vars, et tout autre type d'avantages qu'il peut apporter
En général, si avec filet de sécurité vous concerne donc une approche commune est d'utiliser Java est AtomicReference
pour envelopper votre variable mutable comme ceci:
val fooSeq: AtomicReference[Seq[Foo]] = new AtomicReference(Seq.empty)
et ce serait la meilleure approche si vous avez besoin des résultats intermédiaires plutôt que d'aller avec le constructeur.
Si vous n'avez pas besoin de résultats intermédiaires puis les constructeurs sont généralement mieux. (Bien que Luis Miguel mentionne dans un commentaire Les constructeurs sont en interne mutable et thread-safe nécessairement)
Une troisième alternative consiste à utiliser une structure de données mutable de Scala collections
: https://docs.scala-lang.org/overviews/collections/performance-characteristics.html
Vous pourriez être intéressé par: MutableList
, mais cela aurait encore besoin de l' AtomicReference
emballage pour fil de sécurité si c'est une préoccupation. Il y a des structures de données qui sont en mode natif thread-safe comme TrieMap
ceux sont disponibles encollections.concurrent