import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Resource {
private String name;
private Semaphore semaphore;
private Lock lock;
public Resource(String name) {
this.name = name;
this.semaphore = new Semaphore(1);
this.lock = new ReentrantLock();
}
public void use() throws InterruptedException {
semaphore.acquire();
try {
lock.lock();
try {
System.out.println(name + " is being used by thread " + Thread.currentThread().getName());
Thread.sleep(1000);
} finally {
lock.unlock();
}
} finally {
semaphore.release();
}
}
}
class UserThread extends Thread {
private Resource resource;
public UserThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
try {
resource.use();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
Resource resource = new Resource("Khushi Patil");
UserThread user1 = new UserThread(resource);
UserThread user2 = new UserThread(resource);
user1.setName("Thread 1");
user2.setName("Thread 2");
user1.start();
user2.start();
}
}


Posted on by