import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) {
Brojac b = new Brojac();
Brojac b2 = new Brojac();
MyThread t1 = new MyThread(1, b);
MyThread t2 = new MyThread(2, b2);
t1.start();
t2.start();
try {
t1.join();
t2.join();
}
catch (InterruptedException ie) {
System.out.println(ie);
}
System.out.println(b.getBr());
System.out.println(b2.getBr());
}
}
class MyThread extends Thread {
private int id;
Brojac b;
public MyThread(int _id, Brojac _b) {
id = _id;
b = _b;
}
@Override
public void run() {
for(int i = 0; i < 10; ++i) {
// System.out.println("Thread " + id + " " + i);
b.zgolemi_brojac_semaphore();
// zemi ja vrednosta na b
// zgolemi ja vrednosta T1, T2
// vrati ja vrednost
}
}
}
class Brojac {
private static int br = 0;
private static Lock lock = new ReentrantLock();
private static Semaphore semaphore = new Semaphore(2);
public static void unsafe_zgolemi_brojac() {
br++; // no atomicity
try {
Thread.sleep(10);
}
catch (InterruptedException ie) {
System.out.println(ie);
}
}
public synchronized void safe_zgolemi_brojac() {
br++; // atomocity
}
public void safe_zgolemuvanje() {
synchronized (this) {
br++;
}
}
public static void zgolemi_brojac_mutex() {
lock.lock();
br++;
lock.unlock();
}
public static void zgolemi_brojac_semaphore() {
try {
semaphore.acquire();
br++;
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static int getBr() {
return br;
}
}