User Tools

Site Tools


jpf:start

Java PathFinder

A lot of information about JPF can be found here.

More information can be found here.

Although it describes an old version of JPF, this manual may be useful.

To configure JPF, you may want to use a jpf.properties file containing

search.class = gov.nasa.jpf.search.heuristic.HeuristicSearch
search.heuristic.class = 
  gov.nasa.jpf.search.heuristic.BFSHeuristic

to use a breadth-first traversal of the state space (rather than a depth-first traversal which is the default). To check for race conditions, you may want to add

jpf.listener = gov.nasa.jpf.tools.precise.PreciseRaceDetector

to your jpf.properties file.

To check some properties of our solution to the readers-writers problem by means of JPF, we modified our solution as follows (the attribute writers and assertions have been added).

/**
 * This class represents a database.  There are many competing
 * threads wishing to read and write.  It is acceptable to have
 * multiple processes reading at the same time, but if one thread
 * is writing then no other process may either read or write.
 */
public class Database
{
  private int readers; // number of active readers
  private int writers; // number of active writers
 
  /**
     Initializes this database.
  */
  public Database()
  {
    this.readers = 0;
  }
 
  /**
     Read from this database.
 
     @param number Number of the reader.
  */
  public void read(int number)
  {
    synchronized(this)
    {
      this.readers++;
      System.out.println("Reader " + number + " starts reading.");
    }
 
    final int DELAY = 5000;
    try
    {
       Thread.sleep((int) (Math.random() * DELAY));
    }
    catch (InterruptedException e) {}
 
    assert((this.writers == 1 && this.readers == 0) || this.writers == 0);
 
    synchronized(this)
    {
      System.out.println("Reader " + number + " stops reading.");
      this.readers--;
      if (this.readers == 0)
      {
        this.notifyAll();
      }
    }
  }
 
  /**
     Writes to this database.
 
     @param number Number of the writer.
  */
  public synchronized void write(int number)
  {
    while (this.readers != 0)
    {
      try
      {
        this.wait();
      }
      catch (InterruptedException e) {}
    }
    System.out.println("Writer " + number + " starts writing.");
    this.writers++;
 
    final int DELAY = 5000;
    try
    {
      Thread.sleep((int) (Math.random() * DELAY));
    }
    catch (InterruptedException e) {}
 
    assert((this.writers == 1 && this.readers == 0) || this.writers == 0);
 
    this.writers--;
    System.out.println("Writer " + number + " stops writing.");
    this.notifyAll();
  }
}
jpf/start.txt · Last modified: 2008/01/21 20:37 by franck

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki