0

What I want to do here is to print even numbers by even consumers, odd numbers by odd consumers.

There is an evenodd method which is basically consuming any number and printing (whether even or odd). I have got 2 even consumer threads, 2 odd consumer threads, 2 evenodd consumer threads and 3 producer threads.

I am new to the semaphores concept, and I tried using it. When I remove the evenodd method and related threads I get the correct output i.e. Even numbers by even threads and odd numbers by odd threads. But when I again put the evenodd method and evenodd threads I get a deadlock.

It would be very helpful if anyone can guide me on this, where I am going wrong and how to fix it. Please throw some light on how I can implement the evenodd method so that it would work correctly.

package lab61;

import java.util.LinkedList;
import java.util.Random;
import java.util.concurrent.Semaphore;

public class Process {

    Semaphore empty;
    Semaphore full;
    Semaphore even;
    Semaphore odd;
    Semaphore mutex;
    //Semaphore evenodd;
    boolean evenb;
    boolean oddb,eo;

    LinkedList<Integer> list;
    Random random;


    public Process(int capacity){
            list=new LinkedList<Integer>();

            empty=new Semaphore(capacity);

            full=new Semaphore(0,true);
            mutex=new Semaphore(1,true);

            even=new Semaphore(0,true);
            evenb=false;
            oddb=false;
            eo=false;

            odd=new Semaphore(0,true);
            //evenodd = new Semaphore(0,true);

            random=new Random();
    }

    public void Producer() throws InterruptedException{

        while(true){

        int a=random.nextInt(100);  

        empty.acquire();
        mutex.acquire();

            list.add(a);
            System.out.println("Producing "+a);
            System.out.println(list);



            if((list.get(0)%2)==0){
                if(!evenb){
                 even.release();
                evenb = true;
                }
            }else if((list.get(0)%2)==1){
                if(!oddb){
                 odd.release();
                oddb = true;
                }


            }
            /*if(((list.get(0)%2)==0)||((list.get(0)%2)==1)){
                if(!eo){
                    evenodd.release();
                    eo = true;
                }
            }*/


        mutex.release();


        full.release();


        }

    }

  public void consumereven() throws InterruptedException{
      while(true){
      //Thread.sleep(2000);
          even.acquire();
          Thread.sleep(2000);
          full.acquire();

          mutex.acquire();

            int value = list.removeFirst();
            System.out.println("I am the even consumer "+ value);
            evenb = false;
            System.out.println(list);

          mutex.release();
          empty.release();

      }

  }


  public void consumerodd() throws InterruptedException{
      while(true){

          //Thread.sleep(2000);
          odd.acquire();
          Thread.sleep(2000);
          full.acquire();
          //odd.acquire();
          mutex.acquire();
            int value = list.removeFirst();
            System.out.println("I am the odd consumer "+ value);
            System.out.println(list);
          oddb = false;
          mutex.release();
          empty.release();

      }

  } 
 public void evenodd() throws InterruptedException {
      while(true){

          full.acquire();
          mutex.acquire();
          int value = list.removeFirst();
          System.out.println("i am the evenodd consumer " + value );

          if((list.get(0)%2)==0){
              if(oddb=true){
                  odd.acquire();
                  oddb=false;
              }
              if(evenb==false){
                  even.release();
                  evenb = true;
              }
          }
          else if((list.get(0)%2)==1){
              if(evenb=true){
                  even.acquire();
                  evenb=false;
              }
              if(oddb==false){
                  odd.release();
                  oddb = true;
              }
          }
          System.out.println(list);


          mutex.release();
          empty.release();
      }
  }



    }
package lab61;

import lab6.producer;

public class App {


    public static void main(String[] args) throws InterruptedException{

        Process p=new Process(10);


        Thread producer1=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.Producer();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });


        Thread producer2=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.Producer();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

        Thread producer3=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.Producer();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });



        Thread consumereven1=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumereven();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });

Thread consumereven2=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumereven();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });

Thread consumerodd1=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumerodd();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });
Thread consumerodd2=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.consumerodd();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
});
Thread evenodd1=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.evenodd();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
});
Thread evenodd2=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.evenodd();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
});


        producer1.start();
        producer2.start();
        producer3.start();
        consumereven1.start();
        consumereven2.start();
        consumerodd1.start();
        consumerodd2.start();
        evenodd1.start();
        evenodd2.start();

        producer1.join();
        producer2.join();
        producer3.join();
        consumereven1.join();
        consumereven2.join();
        consumerodd1.join();
        consumerodd2.join();
        evenodd1.join();
        evenodd2.join();

    }





}
Mogsdad
  • 44,709
  • 21
  • 151
  • 275
Hemanshu Sethi
  • 139
  • 1
  • 1
  • 7

2 Answers2

1

The code can cause a deadlock because consumereven() and consumerodd() methods acquire the even or odd semaphore before the full and mutex semaphores, while the evenodd() method acquires the full and mutex semaphores before the even or odd semaphore. This results in a situation where, say, a thread running consumereven() has the even semaphore but is blocked while waiting on the full semaphore, while a thread running evenodd() has the full semaphore, but is blocked on the even semaphore, so the two threads are deadlocked.

To help prevent deadlocks, when you use multiple locks, it's best always to acquire them in the same order wherever they are used, and release them in the reverse order of acquisition.

Warren Dew
  • 8,790
  • 3
  • 30
  • 44
  • i got your point...but still can you be a little specific to the code i am not getting what should i do in evenodd method – Hemanshu Sethi Oct 15 '15 at 15:51
  • It would be easier to change the consumereven() and consumerodd() methods. Just move full.acquire() and mutex.acquire() ahead of even.acquire() or odd.acquire(). That way the locks will be acquired in the same order in all three functions. – Warren Dew Oct 15 '15 at 16:19
0

Not a Great way of doing it but u could do something like.

import java.util.LinkedList;
import java.util.Random;
import java.util.concurrent.Semaphore;

public class P1 {

    Semaphore empty;
    Semaphore full;
    Semaphore even;
    Semaphore odd;
    Semaphore mutex;
    Semaphore oddeven;

    LinkedList<Integer> list;
    Random random;
    boolean oddb;
    boolean evenb; 
    boolean oddevenb;

    public P1(int capacity){
            list=new LinkedList<Integer>();

            empty=new Semaphore(capacity,true);

            full=new Semaphore(0,true);

            mutex=new Semaphore(1,true);

            even=new Semaphore(0,true);

            odd=new Semaphore(0,true);

            oddeven=new Semaphore(0,true);

            oddb=false;
            evenb=false;
            oddevenb = false;

            random=new Random();
    }

    public void Producer(String s) throws InterruptedException{

        while(true){

        int a=random.nextInt(100);  

        empty.acquire();
        mutex.acquire();

            list.add(a);

            System.out.println("Producing "+a+" By "+s);
            System.out.println(list);
            int temp=random.nextInt(3)+1;

            if(temp==1  ){
                if(oddevenb==false){
                oddeven.release();
                oddevenb=true;
                evenb=true;
                oddb=true;
                }

            }

            else{
             if((list.get(0))%2==0){

                if(evenb==false){
                    even.release();
                    evenb=true;
                    oddevenb=true;
                }


            }else if((list.get(0))%2==1){


                    if( oddb==false) {
                    odd.release();
                    oddevenb=true;
                    oddb=true;

                }
            }       


            }



        mutex.release();
        full.release();


        }

    }

  public void consumereven(String s) throws InterruptedException{
      while(true){

         // Thread.sleep(5000);
          even.acquire();
          full.acquire();
          mutex.acquire();

            int value=list.removeFirst();
            System.out.println("I am the "+ s +" consumer "+value);
            evenb=false;
            oddevenb=false;
            System.out.println(list);

          mutex.release();
          empty.release();

      }

  }


  public void consumerodd(String s) throws InterruptedException{
      while(true){

          //Thread.sleep(5000);
          odd.acquire();
          full.acquire();
          mutex.acquire();

            int value=  list.removeFirst();;
            System.out.println("I am the "+s+"  consumer "+value);
            oddb=false;
            oddevenb=false;
            System.out.println(list);



          mutex.release();
          empty.release();

      }

  } 

  public void consumeroddeven(String s) throws InterruptedException{
      while(true){

          //Thread.sleep(5000);



          oddeven.acquire();
          full.acquire();
          mutex.acquire();

            int value=  list.removeFirst();;


            System.out.println("I am the  "+s+" "+value);

            System.out.println(list);
            oddevenb=false;
            evenb=false;
            oddb=false;

          mutex.release();
          empty.release();

      }

  }




}




public class App3 {


    public static void main(String[] args) throws InterruptedException{

        final P1 p=new P1(10);


        Thread producer=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.Producer("p1");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });


 Thread producer2=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.Producer("p2");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

Thread producer3=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.Producer("p3");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
},"p3");




        Thread consumereven=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumereven("even1");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });


        Thread consumereven2=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumereven("even2");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });


Thread consumerodd=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumerodd("odd1");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });


Thread consumerodd2=new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    p.consumerodd("odd2");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });


Thread consumer=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.consumeroddeven("NC1");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
});


Thread consumer1=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            p.consumeroddeven("NC2");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
});

        producer.start();
        producer2.start();
        producer3.start();


        consumereven.start();
        consumereven2.start();

        consumerodd.start();
        consumerodd2.start();

        consumer.start();
        consumer1.start();


        producer.join();
        producer2.join();
        producer3.join();

        consumereven.join();
        consumereven.join();
        consumereven2.join();


        consumerodd.join();
        consumerodd.join();
        consumerodd2.join();


        consumer.join();
        consumer1.join();

    }





}
Aditya Sharma
  • 389
  • 3
  • 11