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