ReentrantLock

图片说明

图片说明

图片说明
图片说明

这里要注意的是lock方法要在try方法外面执行,因为lock方法有可能失败,unlock方法应该放在finally方法中执行
图片说明

reentrantlock比synchronized更加安全,如果使用synchronized,线程要不就获得锁,要不就一直等待下去,但是对于reentrantlock可以通过trylock进行指定超时的时间,不会导致死锁,trylock返回的是true哦这false 在这里们可以使用if进行判断

图片说明

图片说明

图片说明
对于写数据或者修改数据的操作可以使用reentrantlock进行加锁,保证只有一个线程执行临界区代码,但是对于读操作可以允许多个线程进行访问

图片说明

图片说明
图片说明

图片说明

Condition

Condition是结合reentrantLock进行唤醒或者等待
图片说明
图片说明
图片说明
图片说明
图片说明

Concurrent集合

图片说明
可以通过reentrantLock结合condition实现 blocking Queue类似于消费者生产者队列,没有的话就需要等待直到条件满足也可以使用concurrent自带的
图片说明
图片说明

图片说明
图片说明
虽然能够推荐这种方式转换成线程安全的类,但是效率不高,推荐使用上面concurrent提供的
图片说明

Atomic

图片说明
图片说明
图片说明
图片说明
图片说明

ExecutorService

图片说明
图片说明
图片说明
图片说明
图片说明
图片说明

图片说明
图片说明

Future

图片说明

如果使用了executorService声明了一个线程池,通过submit去提交方法,声明的这个线程使用过继承runnable接口来实现的,无法将返回值传给主进程,虽然也可以需要在里面声明一个变量,但是还是很麻烦

图片说明

通过实现了callable接口后,实现call方法和传入泛型,就能够返回指定类型的数据
图片说明

通过提交继承了callable接口的对象,submit以后就能够获取一个future对象,在之后的某个时刻通过调用future对象的get方法就能够获得返回值,如果已经执行完毕就直接获得返回值,如果没有完成就会造成阻塞,直到完成为止
图片说明

图片说明
图片说明

CompletableFuture

图片说明
为了完成线程完毕后执行的后续操作,我们需要不断的轮询判断,或者通过get方法阻塞,这都不是很好的解决方案
图片说明

图片说明
通过completableFuture接口后,我们就可以自定义好钩子函数,当执行成功的时候执行哪个方法函数,当出现异常的时候执行哪个
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明

Fork/Join

图片说明
图片说明
图片说明
图片说明

图片说明
图片说明