java并发工具包-Semaphore(信号量)

1. 使用Semaphore做锁

  1. acquire和release是需要对应的;可以一次性一个线程acquire X个;但是也要release X个;若数据不对应,会造成blocked。
  2. release一定要放在finally代码块中,防止出现异常,没有释放信号量。 同样,只要对于释放锁,都应该放在finally中,保证不管发生任何事情,都能够释放锁。
public class SemaphoreDemo1 {

    public static void main(String[] args) {
        SemaphoreLock lock = new SemaphoreLock();

        IntStream.rangeClosed(0, 3).forEach(item -> {            
        	new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " start");
                try {                    
                	lock.lock();
                    System.out.println(Thread.currentThread().getName() + " work");
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {                    
                	e.printStackTrace();
                } finally {                    
                	lock.unlock();
                }
                
                System.out.println(Thread.currentThread().getName() + " finished!");
            }, "Thread " + item).start();
        });
    }
}

class SemaphoreLock {

    private final Semaphore LOCK = new Semaphore(1);

    public void lock() throws InterruptedException {        
    	LOCK.acquire(); // 根据new Semaphore(1);的参数值, 来判断, 是否别的线程能获取到此信号量.
    }
    public void unlock() {
        LOCK.release();
    }
}

你可能感兴趣的:(JAVA,java多线程)