diff options
author | Stefan Zeiger <szeiger@novocode.com> | 2016-08-08 20:56:07 +0200 |
---|---|---|
committer | Stefan Zeiger <szeiger@novocode.com> | 2016-08-12 17:58:28 +0200 |
commit | a52882333e0d690304d0c49a89a0725d0934f43a (patch) | |
tree | 3179a6e9ae23262711a47cd0d8a8b3152a04bbad /src/library/scala/collection/immutable/Traversable.scala | |
parent | 25b29ea4036b0bc910a5eb07d64c93d294be4e55 (diff) | |
download | scala-a52882333e0d690304d0c49a89a0725d0934f43a.tar.gz scala-a52882333e0d690304d0c49a89a0725d0934f43a.tar.bz2 scala-a52882333e0d690304d0c49a89a0725d0934f43a.zip |
SI-7838 Document the multi-threading semantics of List and Vector
Making them completely thread-safe would be too expensive (in terms
of performance of single-threaded use cases).
Diffstat (limited to 'src/library/scala/collection/immutable/Traversable.scala')
-rw-r--r-- | src/library/scala/collection/immutable/Traversable.scala | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/library/scala/collection/immutable/Traversable.scala b/src/library/scala/collection/immutable/Traversable.scala index 5fc0607a00..3d4ba95a16 100644 --- a/src/library/scala/collection/immutable/Traversable.scala +++ b/src/library/scala/collection/immutable/Traversable.scala @@ -18,6 +18,17 @@ import mutable.Builder /** A trait for traversable collections that are guaranteed immutable. * $traversableInfo * @define mutability immutable + * + * @define usesMutableState + * + * Note: Despite being an immutable collection, the implementation uses mutable state internally during + * construction. These state changes are invisible in single-threaded code but can lead to race conditions + * in some multi-threaded scenarios. The state of a new collection instance may not have been "published" + * (in the sense of the Java Memory Model specification), so that an unsynchronized non-volatile read from + * another thread may observe the object in an invalid state (see + * [[https://issues.scala-lang.org/browse/SI-7838 SI-7838]] for details). Note that such a read is not + * guaranteed to ''ever'' see the written object at all, and should therefore not be used, regardless + * of this issue. The easiest workaround is to exchange values between threads through a volatile var. */ trait Traversable[+A] extends scala.collection.Traversable[A] // with GenTraversable[A] |