随笔分类 - 多线程
摘要:使用Future获得异步执行结果时,要么调用阻塞方法get(),要么轮询看isDone()是否为true,这两种方法都不是很好,因为主线程也会被迫等待。从Java 8开始引入了CompletableFuture,它针对Future做了改进,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调
阅读全文
摘要:/** * java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁* 因为synchronized是Java语言层面提供的语法,所以我们不需要考虑异常,* 而ReentrantLock是Java代码实现的锁,我们就必须先获取锁,然后
阅读全文
摘要:/** * ReentrantLock使用Condition对象来实现wait和notify的功能* 使用Condition时,引用的Condition对象必须从Lock实例的newCondition()返回,这样才能获得一个绑定了Lock实例的Condition实例* Condition提供的aw
阅读全文
摘要:/** * StampedLock和ReadWriteLock相比,改进之处在于:读的过程中也允许获取写锁后写入!这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种乐观锁。* 乐观锁的意思就是乐观地估计读的过程中大概率不会有写入,因此被称为乐观锁。
阅读全文
摘要:/*** JDK提供了ExecutorService实现了线程池功能:* 线程池内部维护一组线程,可以高效执行大量小任务;* Executors提供了静态方法创建不同类型的ExecutorService;* 必须调用shutdown()关闭ExecutorService;* ScheduledThr
阅读全文
摘要:/** * Runnable接口有个问题,它的方法没有返回值。如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便。 * Java标准库还提供了一个Callable接口,和Runnable接口比,它多了一个返回值 * Callable接口是一个泛型接口,可以返回指定类型的结
阅读全文
摘要:一、volatile关键字 volatile关键字的目的是告诉虚拟机:1.每次访问变量时,总是获取主内存的最新值;2.每次修改变量后,立刻回写到主内存。 volatile关键字解决的是可见性问题:当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。volatile关键字解决了共享变量在
阅读全文