class Resource1{
int count = 0;
final Semaphore put = new Semaphore(5);
final Semaphore get = new Semaphore(0);
final Semaphore mutex = new Semaphore(1);
public void produce(){
for (int i = 0; i < 5; i++) {
try {
put.acquire(1);
mutex.acquire(1);
count++;
System.out.println(Thread.currentThread().getName() + "produce:: " + count);
} catch (Exception e) {
e.printStackTrace();
}
finally {
mutex.release(1);
get.release(1);
}
}
}
public void consume(){
for (int i = 0; i < 5; i++) {
try {
get.acquire(1);
mutex.acquire(1);
count--;
System.out.println(Thread.currentThread().getName()+ "consume:: " + count);
}catch (Exception e) {
e.printStackTrace();
} finally {
mutex.release(1);
put.release(1);
}
}
}
}
class Main{
public static void main(String[] args) throws InterruptedException {
Resource1 resource = new Resource1();
new Thread(()->{ resource.consume(); }).start();
new Thread(()->{ resource.consume(); }).start();
new Thread(()->{resource.produce();}).start();
new Thread(()->{resource.produce();}).start();
}
}