工具类

2021-07-01  本文已影响0人  水木共美

1、Phaser CountDownLatch CyclicBarrier Semaphore

public CountDownLatch(int count)   // 构造器  倒计时的计数器
public void await() throws InterruptedException // 这两个await方法会检测现在count值是否为0,如果为0则直接返回,不为0,则会将当前线程挂起,知道count为0唤醒线程,返回
public boolean await(long timeout, TimeUnit unit)  throws InterruptedException
public void countDown()  // 减1   实现是使用的compareAndSetWaitStatus CAS 负责唤醒await的线程

应用:
等待多个任务执行完成后,再执行一个任务
如:以前的app上,多张图片同时上传,全部上传完成再后调用信息上传接口

public CyclicBarrier(int parties)  // 构造器  需要等待多少个线程到达   cyclic的含义是可复用
public CyclicBarrier(int parties, Runnable barrierAction)
public int await()  // 等待parties个线程走到这里,然后再一起放行往后
public int await(long timeout, TimeUnit unit)

应用:
使用上面那个barrierAction可以达到countdown的目的。。
如一辆客车必须装满才能让乘客上车,每个乘客一个线程,当到达客车容量20人时,放开这些乘客,让他们上车买票坐车。

public Semaphore(int permits)  // 构造器 限制同时通过的数量,获取后需要自己释放  fair指是否是公平锁即先到先得
public Semaphore(int permits, boolean fair)

public void acquire() throws InterruptedException // 获取1个许可  -- 阻塞的,会一直等待
public void acquire(int permits) throws InterruptedException // 获取permits个许可  -- 阻塞的,会一直等待
public void release() // 释放1个许可
public void release(int permits) // 释放permits个许可

// 下面这4个是非阻塞获取许可和超时阻塞获取
public boolean tryAcquire()
public boolean tryAcquire(long timeout, TimeUnit unit)
public boolean tryAcquire(int permits)
public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException

应用:限流请求数量

public Phaser()  // 构建相移器,标识需要parties个到达才能往下走   可以通过register添加parties的数量
public Phaser(int parties)
public Phaser(Phaser parent)
public Phaser(Phaser parent, int parties)

public int register() // parties加1

public int arrive()// 只标记到达,不等待
public int arriveAndAwaitAdvance() //标记到达并阻塞等待下一阶段
public int arriveAndDeregister() //到达并将自己注销

可以用多次CyclicBarrier实现Phaser的阶段请求
但是CyclicBarrier不能动态修改parties

应用:几个人参加多个运动比赛,需要每个人都到达,才能开始短跑比赛,需要每个人短跑完了,才能开始长跑,需要每个人都长跑完了,才能开始跳远。。。

2、ArrayList的线程安全版本

CopyOnWriteArrayList
Collections.synchronizedList(List list) 返回一个线程安全的SynchronizedList :实现synchronized (mutex)

3、auto increment

mysql
5.1.22 之前 表锁
5.1.22之后 innodb_autoinc_lock_mode

默认值时1
insert 。。。select 会发生锁表

4、jsr版本

https://blog.csdn.net/belvine/article/details/90055231

上一篇下一篇

猜你喜欢

热点阅读