java5的Semaphere同步工具

1、概述

    一、Semaphore能夠維護當前訪問自身的線程個數,並提供了同步機制。使用Semaphore能夠控制同時訪問資源的線程個數,例如,實現一個文件容許的併發訪問數。java

    > Semaphore實現的功能就相似廁全部5個坑,假若有十我的要上廁所,那麼同時能有多少我的去上廁所呢?同時只能有5我的可以佔用,當5我的中的任何一我的讓開後,其中在等待的另外5我的中又有一個能夠佔用了。併發

    > 另外等待的5我的中能夠是隨機得到優先機會,也能夠是按照先來後到的順序得到機會,這取決於構造Semaphore對象時傳入的參數選項。dom

    二、單個信號量的Semaphore對象能夠實現互斥鎖的功能,而且能夠是由一個線程得到了「鎖」,再由另外一個線程釋放「鎖」,這可應用於死鎖恢復的一些場合。工具

2、代碼描述

    一、SemaphoreTest

package com.lh.threadtest.t11;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/****
 * 
* @ClassName: SemaphoreTest 
* @Description: java5的Semaphere同步工具
* @author Liu
* @date 2018年1月18日 下午4:08:44 
*
 */
public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final Semaphore sp = new Semaphore(3);
		for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println(
							"線程" + Thread.currentThread().getName() + "進入,當前已有" + (3 - sp.availablePermits()) + "個併發");
					try {
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("線程" + Thread.currentThread().getName() + "即將離開");
					sp.release();
					// 下面代碼有時候執行不許確,由於其沒有和上面的代碼合成原子單元
					System.out.println(
							"線程" + Thread.currentThread().getName() + "已離開,當前已有" + (3 - sp.availablePermits()) + "個併發");
				}
			};
			service.execute(runnable);
		}
	}

}

3、關鍵點

   一、public Semaphore(int permits)中的permits > 1多個互斥,=1 爲單個互斥。ui

   二、public Semaphore(int permits,boolean fair)中的fair爲true表示遵循先到先進,不然不保證公平。spa

   三、Semaphore單個信號量比互斥鎖效果更好,由於鎖由本身掌控。線程

相關文章
相關標籤/搜索