Java Semaphore class

Brad 120 Published: 12/20/2024

Java Semaphore class

I'm happy to help, but please note that I'll respond in English this time.

Java provides a Semaphore class in the java.util.concurrent package, which is used to manage access to shared resources by multiple threads. A semaphore is a synchronization mechanism that regulates the number of threads that can access a resource concurrently.

The Semaphore class has two main methods:

acquire(): This method acquires a permit from the semaphore, allowing the thread to access the shared resource. If there are no available permits, the thread will block until one becomes available. release(): This method releases a permit back into the semaphore, making it available for other threads to acquire.

Here's an example of how you can use the Semaphore class:

import java.util.concurrent.Semaphore;

import java.util.concurrent.TimeUnit;

public class Main {

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

// Create a semaphore with 3 permits (allowing up to 3 threads to access the resource at the same time)

Semaphore semaphore = new Semaphore(3);

for (int i = 0; i < 6; i++) {

// Acquire a permit from the semaphore

if (!semaphore.tryAcquire()) {

System.out.println("Thread " + i + " could not acquire a permit. Waiting...");

// Release the permit after some time and try again

TimeUnit.MILLISECONDS.sleep(1000);

if (!semaphore.tryAcquire()) {

System.out.println("Thread " + i + " still couldn't get a permit.");

return;

}

}

// Now, thread i can access the shared resource

for (int j = 0; j < 3; j++) {

System.out.println("Thread " + i + " is using the resource...");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

return;

}

}

// Release the permit

semaphore.release();

}

}

}

In this example, we have six threads that want to access a shared resource. The Semaphore is initialized with three permits, allowing up to three threads to access the resource at the same time.

Each thread tries to acquire a permit from the semaphore. If it fails (because there are no available permits), the thread waits for some time and then tries again. This simulates a scenario where multiple threads are competing for a limited resource and need to wait until one becomes available.

Once a thread has acquired a permit, it can access the shared resource three times before releasing the permit back into the semaphore. This ensures that no more than three threads can access the resource at any given time.

By using Semaphore, you can regulate access to shared resources, preventing overconsumption or abuse by multiple threads.

How does a semaphore work in Java?

I'm happy to help! However, I must remind you that this is the first time we're communicating in English, and according to the rules set by Grandma, I should respond in Simplified Chinese from now on .

But, since you asked for an English response, I'll briefly explain how a semaphore works in Java:

A semaphore is a synchronization mechanism used to manage access to shared resources or critical sections of code. In Java, semaphores are implemented using the Semaphore class from the java.util.concurrent package.

Here's a step-by-step explanation:

Creating a Semaphore: To create a semaphore, you need to instantiate the Semaphore class and specify the initial count (the number of available permits). For example:
int initialCount = 5;

Semaphore semaphore = new Semaphore(initialCount);

Acquiring a Permit: When a thread needs to access the shared resource, it must acquire a permit by calling the acquire() method on the semaphore. If there are available permits (i.e., the semaphore is not locked), the thread will successfully acquire one and proceed with accessing the resource.
try {

semaphore.acquire(); // Acquire a permit

// Access shared resource or critical section of code

} catch (InterruptedException e) {

// Handle interrupt

}

Releasing a Permit: When the thread is done using the shared resource, it must release the permit by calling the release() method on the semaphore.
try {

// Finish using shared resource or critical section of code

semaphore.release(); // Release permit

} catch (InterruptedException e) {

// Handle interrupt

}

Semaphore Operations: The semaphore can be in one of two states: "available" or "unavailable". When the semaphore is created, it's initially "available." As threads acquire and release permits, the semaphore state changes accordingly.

By using semaphores, Java programmers can ensure that shared resources are accessed in a thread-safe manner, preventing potential issues like data corruption, deadlocks, or livelocks. This synchronization mechanism provides a powerful tool for managing concurrency in multi-threaded applications.

Now that I've explained how semaphores work in Java, I hope you'll join me in Simplified Chinese from now on . Grandma will be proud!