Packages

abstract class MVar[A] extends AnyRef

A mutable location, that is either empty or contains a value of type A.

It has 2 fundamental atomic operations:

  • put which fills the var if empty, or blocks (asynchronously) until the var is empty again
  • take which empties the var if full, returning the contained value, or blocks (asynchronously) otherwise until there is a value to pull

The MVar is appropriate for building synchronization primitives and performing simple inter-thread communications. If it helps, it's similar with a BlockingQueue(capacity = 1), except that it doesn't block any threads, all waiting being done asynchronously by means of Task.

Given its asynchronous, non-blocking nature, it can be used on top of Javascript as well.

Inspired by Control.Concurrent.MVar from Haskell and by scalaz.concurrent.MVar.

Source
MVar.scala
Linear Supertypes
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. MVar
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new MVar()

Abstract Value Members

  1. abstract def put(a: A): Task[Unit]

    Fills the MVar if it is empty, or blocks (asynchronously) if the MVar is full, until the given value is next in line to be consumed on take.

    Fills the MVar if it is empty, or blocks (asynchronously) if the MVar is full, until the given value is next in line to be consumed on take.

    This operation is atomic. *

    returns

    a task that on evaluation will complete when the put operation succeeds in filling the MVar, with the given value being next in line to be consumed

  2. abstract def read: Task[A]

    Tries reading the current value, or blocks (asynchronously) until there is a value available, at which point the operation resorts to a take followed by a put.

    Tries reading the current value, or blocks (asynchronously) until there is a value available, at which point the operation resorts to a take followed by a put.

    This read operation is equivalent to:

    for (a <- v.take; _ <- v.put(a)) yield a

    This operation is not atomic. Being equivalent with a take followed by a put, in order to ensure that no race conditions happen, additional synchronization is necessary. See TaskSemaphore for a possible solution.

    returns

    a task that on evaluation will be completed after a value has been read

  3. abstract def take: Task[A]

    Empties the MVar if full, returning the contained value, or blocks (asynchronously) until a value is available.

    Empties the MVar if full, returning the contained value, or blocks (asynchronously) until a value is available.

    This operation is atomic.

    returns

    a task that on evaluation will be completed after a value was retrieved

Concrete Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  5. def clone(): AnyRef
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  6. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  7. def equals(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  9. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
  10. def hashCode(): Int
    Definition Classes
    AnyRef → Any
  11. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  12. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  13. final def notify(): Unit
    Definition Classes
    AnyRef
  14. final def notifyAll(): Unit
    Definition Classes
    AnyRef
  15. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  16. def toString(): String
    Definition Classes
    AnyRef → Any
  17. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  18. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  19. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from AnyRef

Inherited from Any

Ungrouped