一.ReadWriteLock是什么?
首先明确一下,不是说ReentrantLock不好,只是ReentrantLock某些时候有局限。如果使用ReentrantLock,可能本身是为了 防止线程A在写数据,线程B在读数据造成数据不一致,但这样,如果线程C在读数据,线程D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个,才诞生了读写锁ReadWriteLock。
ReadWriteLock是一个读写锁接口。
ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写,写和读,写和写之间才会互斥,提升了读写的性能。
二.FutureTask是什么
FutureTask表示一个异步运算的任务。FutureTask里面可以传入一个Callable的具体实现,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然,由于FutureTask也是Runnable 接口的实现类,所以FutureTask也可以放入线程池中。
三.synchronized和ReentrantLock的区别
synchronized是和if,else,for一样的关键字,ReentrantLock是类,这是两者的本质区别。
既然ReentrantLock是类,那么它就提供了比syncronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock 比syncronized的扩展性体现在以下几点上:
1.ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
2.ReentrantLock可以获取各种锁的信息
3.ReentrantLock可以灵活地实现多路通知
另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word。
四.线程B怎么知道线程A修改了变量?
1.volatile修饰变量
2.synchronized修饰修改变量的方法
3.wait/notify
4.while轮询
五.synchronized、volatile、CAS比较
1.synchironized是悲观锁,属于抢占式,会引起其他线程阻塞
2.volatile提供多线程共享变量可见性和禁止指令重排序优化
3.CAS是基于冲突检测的乐观锁(非阻塞)
六.sleep方法和wait方法有什么区别?
sleep方法和wait方法都可以放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器。
七.ThreadLocal是什么?有什么用?
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。
简单说ThreadLocal就是一种以空间换时间的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。
八.为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用?
这是JDK强制的,wait()方法和notify()/notifyAll()方法在调用前都必须先获得对象的锁。
九.多线程同步有哪几种方法?
Synchronized关键字
Lock锁实现
分布式锁等。