Bootstrap

Java并发工具类

  • AtomicInteger 提供原子性的加减,比较。

  • Semaphore信号量(对synchronized和ReentrantLock的一种扩展)基于AQS的
    • 可以指定多个线程同时访问某一资源(同一时间可允许指定个数线程同时访问某一资源)
    • newSemaphore(3) 必须设置可以同时访问某一资源的线程数,并且默认获得的是非公平锁
      • 比如一共创建9个线程,每组三个,这三组线程内部先后执行肯定是无序的,但是组与组之间,其实也是无序的,不一定先创建的线程,会优先获得准入许可
    • newSemaphore(3,true),指定是公平锁
      • 比如一共创建九个线程,每组三个,这三组线程内部是无序的,组与组之间是有序的,先创建的线程会优先成为一组
    • acquire()获得准入许可,若无法获得许可,线程会等待,直到线程释放一个许可或者当前线程被中断
    • acquireUninterruptibly() 能力和acquire一样,但是不响应中断
    • tryAcquire() 带返回值的,获取许可,成功就返回true,失败就返回false,(也可以带时间参数的)
    • Release()释放许可

  • ReentrantReadWriteLock读写锁:允许多个线程同时读,即读锁和读锁之间是非阻塞的,其余读写/写写都会阻塞

  • CountDownLatch倒计时器(面试常问和CyclicBarrier区别

主线程创建CountDownLatch实例并定义计数个数(比如2个),主线程执行countDownLatch.await()后被阻塞,子线程1调用countDownLatch.countDown(),子线程2调用countDownLatch.countDown(),经过2次countDown后主线程被激活,继续执行下面的逻辑

  • CyclicBarrier循环栅栏 (与CountDownLatch类似,但它支持反复使用)

主线程创建CyclicBarrier并定义计数(比如2),子线程1执行一次cyclicBarrier.await() 进入阻塞等待,子线程2执行一次cyclicBarrier.await() 达到2次,则该两个子线程可继续执行下面逻辑,并且可分别继续执行cyclicBarrier.await(),达到两次后,又可分别解除阻塞

;