Circular_Buffer

3.1 忘了,很简单. Waral 
3.2 circular buffer: 实现两个function:get(), put()
3.3 follow up1: consumer productor problem,一个semaphore解决
3.4 follow up2: 很多个thread同时访问,根据他说只用一个mutex,我做麻烦了



/**
 ** Java Program to implement Circular Buffer
 **/

 import java.util.Scanner;

/** Class Circular Buffer **/
class CircularBuffer
{
    private int maxSize;
    private int front = 0;  
    private int rear = 0;  
    private int bufLen = 0;  
    private char[] buf;    

    private static Object obj = new Object();

    /** constructor **/
    public CircularBuffer(int size) 
    {
        maxSize = size;
        front = rear = 0;
        rear = 0;
        bufLen = 0;
        buf = new char[maxSize];
    }
    /** function to get size of buffer **/
    public int getSize()
    {
        return bufLen;
    }
    /** function to clear buffer **/
    public void clear()
    {
        front = rear = 0;
        rear = 0;
        bufLen = 0;
        buf = new char[maxSize];
    }
    /** function to check if buffer is empty **/
    public boolean isEmpty() 
    {
        return bufLen == 0;
    }
    /** function to check if buffer is full **/
    public boolean isFull() 
    {
        return bufLen == maxSize;
    } 

    /** insert an element **/
    public void insert(char c) 
    {
        if (!isFull() ) 
        {
            bufLen++;
            rear = (rear + 1) % maxSize;
            buf[rear] = c;
        }
        else
            System.out.println("Error : Underflow Exception");
    }
    /** delete an element **/
    public char get() 
    {
        if (!isEmpty() ) 
        {
            bufLen--;
            front = (front + 1) % maxSize;
            return buf[front];
        }
        else 
        {
            System.out.println("Error : Underflow Exception");
            return ' ';
        }
    }  

    /** function to print buffer **/
    public void display() 
    {
        System.out.print("\nBuffer : ");
        for (int i = 0; i < maxSize; i++)
            System.out.print(buf[i] +" ");
        System.out.println();    
    }
}


thread safe



/**
 ** Java Program to implement Circular Buffer
 **/

 import java.util.Scanner;

/** Class Circular Buffer **/
class CircularBuffer
{
    private int maxSize;
    private int front = 0;  
    private int rear = 0;  
    private int bufLen = 0;  
    private char[] buf;    

    /** constructor **/
    public CircularBuffer(int size) 
    {
        maxSize = size;
        front = rear = 0;
        rear = 0;
        bufLen = 0;
        buf = new char[maxSize];
    }
    /** function to get size of buffer **/
    public int getSize()
    {
        return bufLen;
    }
    /** function to clear buffer **/

    /** function to check if buffer is empty **/
    public boolean isEmpty() 
    {
        return bufLen == 0;
    }
    /** function to check if buffer is full **/
    public boolean isFull() 
    {
        return bufLen == maxSize;
    } 

    /** insert an element **/
    public void insert(char c) 
    {
        synchronized (obj) {
        if (!isFull() ) 
        {
            bufLen++;
            rear = (rear + 1) % maxSize;
            buf[rear] = c;
        }
        else
            System.out.println("Error : Underflow Exception");

        }
    }

        public char delete() 
    {
        synchronized (obj) {
        if (!isEmpty() ) 
        {
            bufLen--;
            front = (front + 1) % maxSize;
            return buf[front];
        }
        else 
        {
            System.out.println("Error : Underflow Exception");
            return ' ';
        }
        }
    }       

}

results matching ""

    No results matching ""