CSP for Java
(JCSP) 1.0-rc7

jcsp.lang
Class One2AnyChannel

java.lang.Object
  |
  +--jcsp.lang.One2AnyChannel
All Implemented Interfaces:
ChannelInput, ChannelOutput, Serializable

public class One2AnyChannel
extends Object
implements ChannelInput, ChannelOutput, Serializable

This implements a one-to-any object channel, safe for use by one writer and many readers.

Description

One2AnyChannel is an implementation of a channel which is safe for use by many reading processes but only one writer. Reading processes compete with each other to use the channel. Only one reader and the writer will actually be using the channel at any one time. This is taken care of by One2AnyChannel -- user processes just read from or write to it.

Please note that this is a safely shared channel and not a broadcaster. Currently, broadcasting has to be managed by writing active processes (see DynamicDelta for an example).

All reading processes and the writing process commit to the channel (i.e. may not back off). This means that the reading processes may not ALT on this channel.

The default semantics of the channel is that of CSP -- i.e. it is zero-buffered and fully synchronised. A reading process must wait for the matching writer and vice-versa.

However, the static create method allows the user to create a channel with a plug-in driver conforming to the ChannelDataStore interface. This allows a variety of different channel semantics to be introduced -- including buffered channels of user-defined capacity (including infinite), overwriting channels (with various overwriting policies) etc.. Standard examples are given in the jcsp.util package, but careful users may write their own.

Other static create methods allows the user to create fully initialised arrays of channels, including plug-ins if required.

Implementation Note and Caution

Fair servicing of readers to this channel depends on the fair servicing of requests to enter a synchronized block (or method) by the underlying Java Virtual Machine (JVM). Java does not specify how threads waiting to synchronize should be handled. Currently, Sun's standard JDKs queue these requests - which is fair. However, there is at least one JVM that puts such competing requests on a stack - which is legal but unfair and can lead to infinite starvation. This is a problem for any Java system relying on good behaviour from synchronized, not just for these 1-any channels.

Author:
P.D.Austin and P.H.Welch
See Also:
One2OneChannel, Any2OneChannel, Any2AnyChannel, ChannelDataStore, Serialized Form

Field Summary
protected  Object readMonitor
          The monitor on which readers must synchronize
protected  Object rwMonitor
          The monitor synchronising reader and writer on this channel
 
Constructor Summary
One2AnyChannel()
           
 
Method Summary
static One2AnyChannel create(ChannelDataStore store)
          Creates a One2AnyChannel using the specified ChannelDataStore.
static One2AnyChannel[] create(int n)
          Creates an array of One2AnyChannel.
static One2AnyChannel[] create(int n, ChannelDataStore store)
          Creates an array of One2AnyChannel using the specified ChannelDataStore.
 Object read()
          Reads an Object from the channel.
 void write(Object value)
          Writes an Object to the Channel.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

rwMonitor

protected Object rwMonitor
The monitor synchronising reader and writer on this channel

readMonitor

protected final Object readMonitor
The monitor on which readers must synchronize
Constructor Detail

One2AnyChannel

public One2AnyChannel()
Method Detail

read

public Object read()
Reads an Object from the channel.
Specified by:
read in interface ChannelInput
Returns:
the object read from the channel.

write

public void write(Object value)
Writes an Object to the Channel. This method also ensures only one of the writers can actually be writing at any time. All other writers are blocked until it completes the write.
Specified by:
write in interface ChannelOutput
Parameters:
value - The object to write to the Channel.

create

public static One2AnyChannel[] create(int n)
Creates an array of One2AnyChannel.
Parameters:
n - the number of channels to create in the array
Returns:
the array of One2AnyChannel

create

public static One2AnyChannel create(ChannelDataStore store)
Creates a One2AnyChannel using the specified ChannelDataStore.
Returns:
the One2AnyChannel

create

public static One2AnyChannel[] create(int n,
                                      ChannelDataStore store)
Creates an array of One2AnyChannel using the specified ChannelDataStore.
Parameters:
n - the number of channels to create in the array
Returns:
the array of One2AnyChannel

CSP for Java
(JCSP) 1.0-rc7

Submit a bug or feature to jcsp-team@kent.ac.uk
Version 1.0-rc7 of the JCSP API Specification (Copyright 1997-2006 P.D.Austin and P.H.Welch - All Rights Reserved)
Java is a trademark or registered trademark of Sun Microsystems, Inc. in the US and other countries.