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
- Alphabetic
- By Inheritance
- MVar
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new MVar()
Abstract Value Members
-
abstract
def
put(a: A): Task[Unit]
Fills the
MVar
if it is empty, or blocks (asynchronously) if theMVar
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 theMVar
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 theMVar
, with the given value being next in line to be consumed
-
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 aput
, 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
-
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
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
This is the API documentation for the Monix library.
Package Overview
monix.execution exposes lower level primitives for dealing with asynchronous execution:
Atomic
types, as alternative tojava.util.concurrent.atomic
monix.eval is for dealing with evaluation of results, thus exposing Task and Coeval.
monix.reactive exposes the
Observable
pattern:Observable
implementationsmonix.types implements type-class shims, to be translated to type-classes provided by libraries such as Cats or Scalaz.
monix.cats is the optional integration with the Cats library, providing translations for the types described in
monix.types
.monix.scalaz is the optional integration with the Scalaz library, providing translations for the types described in
monix.types
.