AQS-tools

作者: sizuoyi00 | 来源:发表于2019-12-03 00:43 被阅读0次

    Semaphore

    semaphore:控制访问特定资源的线程数目,一次开启指定数量的线程处理
    使用场景:资源访问,服务限流

    semaphore 公共资源池 共享模式 非公平锁 clh双向队列
    公共资源没有了则入队操作:头尾节点为null,先初始化,然后依次插入队列,双向队列更新前驱后继,更新头尾节点
    入队后操作:将状态失效的队列删除,cas更新状态,下次自旋新状态会进入到一个方法,该方法作用为阻塞当前线程 以此实现限流

    共享模式释放工作资源:顺序唤醒阻塞队列中的线程,不会全部唤醒,除非队列为广播状态,具体唤醒个数与资源池中资源个数有关

    demo

     public static void main(String[] args) {
            Semaphore semaphore = new Semaphore(2);
            for (int i = 0; i < 5; i++) {
                new Thread(() -> {
                    try {
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName() + ":aquire()" + System.currentTimeMillis());
                        Thread.sleep(1000);
                        semaphore.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        }
    

    结果形式为两条两条打印

    Thread-0:aquire()1575217007802
    Thread-1:aquire()1575217007802
    Thread-2:aquire()1575217008803
    Thread-3:aquire()1575217008803
    Thread-4:aquire()1575217009804

    Countdownlatch

    CountDownLatch能够使一个线程等待其他线程完成各自的工作后再执行。
    应用场景:excel多线程多sheet页解析,全部sheet页解析完成后才返回解析完成。原理与semaphore类似

    demo:

    public static void main(String[] args) throws InterruptedException {
            long now = System.currentTimeMillis();
            CountDownLatch countDownLatch = new CountDownLatch(2);
    
            new Thread(() -> {
                try {
                    System.out.println("sheet1开始处理");
                    Thread.sleep(2000);
                    System.out.println("sheet1处理完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }).start();
    
            new Thread(() -> {
                try {
                    System.out.println("sheet2开始处理");
                    Thread.sleep(1000);
                    System.out.println("sheet2处理完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }).start();
    
            //等待2个线程任务执行完毕,
            countDownLatch.await();
            System.out.println("sheet处理完毕:" + (System.currentTimeMillis() - now));
        }
    

    CyclicBarrier

    栅栏屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
    使用场景:多线程处理数据,最后合并计算结果的场景。

    相关文章

      网友评论

          本文标题:AQS-tools

          本文链接:https://www.haomeiwen.com/subject/bqnrwctx.html