Semaphore in Java

Semaphore 

与操作系统概念中的 信号量和PV操作 类似 控制最大的并发线程数    *countdownLatch也可以实现类似功能

 

Example

// java program to demonstrate 
// use of semaphores Locks 
import java.util.concurrent.*; 

//A shared resource/class. 
class Shared 
{ 
    static int count = 0; 
} 

class MyThread extends Thread 
{ 
    Semaphore sem; 
    String threadName; 
    public MyThread(Semaphore sem, String threadName) 
    { 
        super(threadName); 
        this.sem = sem; 
        this.threadName = threadName; 
    } 

    @Override
    public void run() { 
        
        // run by thread A 
        if(this.getName().equals("A")) 
        { 
            System.out.println("Starting " + threadName); 
            try
            { 
                // First, get a permit. 
                System.out.println(threadName + " is waiting for a permit."); 
            
                // acquiring the lock 
                sem.acquire(); 
            
                System.out.println(threadName + " gets a permit."); 
        
                // Now, accessing the shared resource. 
                // other waiting threads will wait, until this 
                // thread release the lock 
                for(int i=0; i < 5; i++) 
                { 
                    Shared.count++; 
                    System.out.println(threadName + ": " + Shared.count); 
        
                    // Now, allowing a context switch -- if possible. 
                    // for thread B to execute 
                    Thread.sleep(10); 
                } 
            } catch (InterruptedException exc) { 
                    System.out.println(exc); 
                } 
        
                // Release the permit. 
                System.out.println(threadName + " releases the permit."); 
                sem.release(); 
        } 
        
        // run by thread B 
        else
        { 
            System.out.println("Starting " + threadName); 
            try
            { 
                // First, get a permit. 
                System.out.println(threadName + " is waiting for a permit."); 
            
                // acquiring the lock 
                sem.acquire(); 
            
                System.out.println(threadName + " gets a permit."); 
        
                // Now, accessing the shared resource. 
                // other waiting threads will wait, until this 
                // thread release the lock 
                for(int i=0; i < 5; i++) 
                { 
                    Shared.count--; 
                    System.out.println(threadName + ": " + Shared.count); 
        
                    // Now, allowing a context switch -- if possible. 
                    // for thread A to execute 
                    Thread.sleep(10); 
                } 
            } catch (InterruptedException exc) { 
                    System.out.println(exc); 
                } 
                // Release the permit. 
                System.out.println(threadName + " releases the permit."); 
                sem.release(); 
        } 
    } 
} 

// Driver class 
public class SemaphoreDemo 
{ 
    public static void main(String args[]) throws InterruptedException 
    { 
        // creating a Semaphore object 
        // with number of permits 1 
        Semaphore sem = new Semaphore(1); 
        
        // creating two threads with name A and B 
        // Note that thread A will increment the count 
        // and thread B will decrement the count 
        MyThread mt1 = new MyThread(sem, "A"); 
        MyThread mt2 = new MyThread(sem, "B"); 
        
        // stating threads A and B 
        mt1.start(); 
        mt2.start(); 
        
        // waiting for threads A and B 
        mt1.join(); 
        mt2.join(); 
        
        // count will always remain 0 after 
        // both threads will complete their execution 
        System.out.println("count: " + Shared.count); 
    } 
} 

 

 

Starting A
Starting B
A is waiting for a permit.
B is waiting for a permit.
A gets a permit.
A: 1
A: 2
A: 3
A: 4
A: 5
A releases the permit.
B gets a permit.
B: 4
B: 3
B: 2
B: 1
B: 0
B releases the permit.
count: 0

 

上一篇:线程信号量同步


下一篇:Unix/Linux操作系统-线程同步