Was sind die Thread-Sicherheitsgarantien für Guavas ImmutableList.Builder? Die Javadocs sagen nicht.Ist Guavas UnmutableList.Builder thread sicher?
Antwort
Während die Guava Immutable Klassen threadsicher sind, sind ihre Erbauer nicht. Bei den meisten Anwendungen wird nur ein Thread mit einer bestimmten Builder-Instanz interagieren.
Während das Fehlen von Thread-Sicherheit in der Regel nicht dokumentiert werden muss, könnte Javadoc für die Builder für Immutable-Sammlungen sinnvoll sein. Leute können überrascht sein, dass UnveränderlicheListe Thread-sicher ist, während UnveränderlichListe.Builder nicht ist.
Wenn Thread-Sicherheit in den Javadocs nicht erwähnt wird, nehmen Sie es nicht an!
Ernsthafter, "Nein".
Ich würde auch Javadocs von ImmutableList bevorzugen und Freunde enthalten eine solche - offensichtliche, ja - Bemerkung (damit Sie nicht selbst davon ausgehen müssen), weil das "Offensichtliche" nicht immer der Fall ist. Neulich diskutierte ich scala.List
, eine unveränderliche Liste, und einige überraschende Probleme, die es verursachen kann, wenn zwischen Threads unangemessen ausgetauscht wird (über ein Datenrennen), an die Leute nicht gedacht haben, weil sie das Wort "unveränderlich" auf der Dose sehen , und sie setzen "unveränderlich == thread-safe" ein, so dass es sich lohnt, auf der sicheren Seite zu sein, auch wenn "offensichtliche" Fadensicherheitsaspekte dokumentiert werden.
Stimmen Sie mit @Dimitris überein Andreou: definitiv Thread-Sicherheit nicht übernehmen, wenn es nicht als solches dokumentiert ist. Wenn Sie sich bemühen, eine nicht-triviale Klasse threadsafe zu machen, wollen Sie Benutzer wissen.
Darüber hinaus denke ich, dass der häufigste Anwendungsfall für einen Builder thread-restricted ist: dh als eine lokale Variable in einer Methode. Wenn Sie mehrere Threads benötigen, um eine Liste zu erstellen, ist das wirklich unveränderlich?
Wenn Sie mehrere Threads haben, die in eine Liste einfließen, aber sie zu einem bestimmten Zeitpunkt abspeichern und "keine weiteren Änderungen sagen möchten, ist es unveränderlich", dann würde ich etwas schreiben, das die Elemente aus diesen Threads übernimmt und das einfriert Inhalt in eine neue ImmutableList, wenn Sie wissen, dass es fertig ist.
Haben Sie einen Nachweis? Der Artikel "Unveränderliche Sammlungen" (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) sagt "Unveränderliche Objekte können von vielen Threads verwendet werden", aber es sagt nicht explizit "Guava Immutable Collection ist thread-safe" . Ich bin noch nicht überzeugt :-( – 30thh