J'ai une méthode simple qui écrit une ligne de données dans un fichier suivi d'une nouvelle ligne qui est exécutée de manière asynchrone. Lorsque mon programme s'exécute, j'obtiens des lignes "mélangées" dans le fichier en raison de la nature asynchrone des appels. Par exemple ... dire writeToFile (pc, "toto") est exécuté 3 fois de manière asynchrone j'obtenir:Quelle est la meilleure façon d'utiliser les threads Scala pour écrire dans un BufferedWriter?
sortie correcte
foo
foo
foo
sortie incorrecte possible
foofoo
foo
Je suis en mesure d'éviter cette possibilité en utilisant synchronisée méthode comme ceci:
def writeToFile(bw: BufferedWriter, str: String) = synchronized {
bw.write(str)
bw.newLine
}
D'après ce que je fait des recherches je ne peux pas déterminer à quel point cela est "sûr" en ce qui concerne la mise à l'échelle de mon application. Les seuls exemples que je peux trouver en utilisant synchronisé est lors de l'accès aux collections, ne pas écrire dans un fichier. Mon application est construite dans le jeu! Cadre 2.4.2.
Vous avez raison, synchronisé est le moyen conçu par JVM pour verrouiller cet appel de fonction. Toutefois, cela ne signifie pas que BufferedWriter que vous avez passé est protégé pendant ce temps si d'autres threads tentent de l'utiliser, il peut donc être judicieux d'envelopper et de masquer cet objet. Référence ce lien pour plus d'informations: https://twitter.github.io/scala_school/concurrency.html – LaloInDublin