notify和notifyAll区别
wait此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。
被wait的线程,想要继续运行的话,它必须满足2个条件:
由其他线程notify或notifyAll了,并且当前线程被通知到了
经过和其他线程进行锁竞争,成功获取到锁了
2个条件,缺一不可。其实在实现层面,notify和notifyAll都达到相同的效果,都只会有一个线程继续运行。但notifyAll免去了,线程运行完了通知其他线程的必要,因为已经通知过了。什么时候用notify,什么时候使用notifyAll,这就得看实际的情况了。
· 什么是条件锁、读写锁、自旋锁、可重入锁?
条件锁
在lock中提供了与之关联的条件,一个锁可能关联一个或多个条件,这些条件通过condition接口声明。目的是运行线程获取锁并且查看等待某一个条件是否满足,如果不满足则挂起直到某个线程唤醒它们。condition接口提供了挂起线程和唤起线程的机制;
读写锁
Java中读写锁有个接口java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock,它们不是继承关系,但都是基于 AbstractQueuedSynchronizer来实现。ReentrantReadWriteLock的锁策略有两种,分为公平策略和非公平策略
注意: 在同一线程中,持有读锁后,不能直接调用写锁的lock方法 ,否则会造成死锁。。
可重入(Reentrant)锁
如果锁具备可重入性,则称作为可重入锁。像synchronized和 ReentrantLock都是可重入锁。假如某一时刻,线程A执行到了method1,此时线程 A获取了这个对象的锁,而由于method2也是synchronized方法,因为可重入,线程A不需要申请加锁即可执行。(可以理解锁的维度是线程,所以已拥有锁不需要再次申请加锁)。不可重入锁(自旋锁):不可以再次进入方法A,也就是说获得锁进入方法A是此线程在释放锁钱唯一的一次进入方法A。
可中断锁
可中断锁:顾名思义,就是可以相应中断的锁。在Java中,synchronized就不是可中断锁,而Lock是可中断锁。
· 线程池ThreadPoolExecutor的几个参数说明?