21、FutureTask 是什么 ?
这个其实前面有提到过,FutureTask 表示一个异步运算的任务。FutureTask 里面 可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等 待获取、判断是否已经完成、取消任务等操作。当然,由于 FutureTask 也是 Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。
22、synchronized 和 ReentrantLock 的区别
synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类, 这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比 synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的 类变量,ReentrantLock 比 synchronized 的扩展性体现在几点上: 1、ReentrantLock 可以对获取锁的等待时间进行设置,这样就避免了死锁 2、ReentrantLock 可以获取各种锁的信息 3、ReentrantLock 可以灵活地实现多路通知 另外,二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁,synchronized 操作的应该是对象头中 mark word,这点我不能 确定。
23、什么是乐观锁和悲观锁
1、乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应 该有相应的重试逻辑。 2、悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状 态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个 独占的锁,就像 synchronized,不管三七二十一,直接上了锁就操作资源了。
24、线程 B 怎么知道线程 A
修改了变量 1、volatile 修饰变量 2、synchronized 修饰修改变量的方法 3、wait/notify 4、while 轮询
25、synchronized、volatile、CAS 比较
1、synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。
2、volatile 提供多线程共享变量可见性和禁止指令重排序优化。
3、CAS 是基于冲突检测的乐观锁(非阻塞)