北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

使用Semaphore控制并发访问

Posted on 2013-10-31 16:39  CN.programmer.Luxh  阅读(387)  评论(0编辑  收藏  举报

  Semaphore,信号量。

  用在多线程环境下对共享资源访问的一种协调机制。

  当一个线程想要访问共享的资源时,这个线程需要获取Semaphore,如果Semaphore内部计数器的值大于0,Semaphore就会减少内部计数器的值且允许这个线程访问共享资源;

  如果Semaphore内部计数器的值等于0,说明共享资源正在被其他线程访问,就禁止这个线程访问,需等待其他线程释放Semaphore后才能访问。

public class Counter {
    
    //计数器,共享的资源
    public static int count = 0;
    
    //声明Semaphore保护共享的资源,任何时候只允许一个线程访问
    private static final Semaphore semaphore = new Semaphore(1);
    
    public static void add() {
        try {
            //调用acquire()方法获得semaphore
            semaphore.acquire();
            
            System.out.println(Thread.currentThread().getName()+":加1前 count="+count);
            
            count++;
            
            System.out.println(Thread.currentThread().getName()+":加1后 count="+count);
            
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //释放semaphore
            semaphore.release();
        }
        
        
    }
}

 

public class CounterJob implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+":开始执行");
        Counter.add();
    }

}

 

public class CounterMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        //启动10个线程并发访问
        Thread thread[] = new Thread[10];
        for (int i = 0; i < 10; i++) {
            thread[i] = new Thread(new CounterJob(), "Thread" + i);
        }

        for (int i = 0; i < 10; i++) {
            thread[i].start();
        }
    }

}