Java线程同步工具类之闭锁与信号量

闭锁


CountDownLatch主要用来确保某些活动知道其他活动完成后才继续执行,主要用在下面三个方面。


1、当某几个线程等待某一个线程的执行结果,可以使用此方法(FutureTask同样可以实现,大家可以试一下)

2、当希望所有线程都准备好后,再进行执行

3、可以很好的实现对线程执行状态、执行时间的监控


主要使用方法


await:在值归0前,将一直阻塞

countDown:值递减1闭锁侧重点在线程执行的顺序的控制。


程序一:利用coundDownLatch实现对线程的控制


final CountDownLatch start = new CountDownLatch(1);

public static void main(String[] args) {
    new MyCountDown().threadWait();
}

public void threadWait() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                for(int i=0;i<10;i++) {
                    Thread.sleep(1*1000);
                    System.out.println("指定一次操作");
                }
                start.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                start.await();
                System.out.println(Thread.currentThread().getName()+"执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t.setName("线程2");
    t.start();

    Thread t0 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                start.await();
                System.out.println(Thread.currentThread().getName()+"执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t0.setName("线程3");
    t0.start();
}

当闭锁进入终止状态,不能重置。


信号量


Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,可以用来实现阻塞的集合。


主要使用的方法


acquire:获取一个许可,如果没有将阻塞

release:释放被占用的许可给信号量 信号量侧重点在资源的控制。被占用的许可被释放并返还给信号量。


程序二:利用semaphore实现对资源的控制


public final  Set<String> set;

    private Semaphore semaphore;

    public MySemaphore(int a) {
        set = Collections.synchronizedSet(new HashSet<String>());
        semaphore = new Semaphore(10);
    }

    public void add(String str) throws InterruptedException {
        semaphore.acquire(); // 获取一个许可,同时信号量减一,如果不能获取许可,将阻塞
        /dosomething
    }

    public void remove(String str) {
        /dosomething
        semaphore.release(); // 释放许可返还给信号量
    }

信号量侧重点在资源的控制。被占用的许可可以被释放并返还给信号量。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值