ReentrantLock
在jdk5.0之前AQS框架下的锁的性能是远远超过synchronized的,从jdk6.0开始对synchronized做出优化后二者在性能上差异已经不大了。ReentrantLock的有点在于: 灵活性。加锁解锁的过程是可控的,synchronized加锁解锁过程是编译完成后JVM来实现的 可响应中断。synchronized下无法获得锁的线程是BLOCKED的,不可以相应中断。AQS下所有的锁包括重入锁无法获得锁是WAITING的,可相应中断,可以用来解决死锁问题 超时获得锁。同样可以用来缓解死锁问题 支持公平锁避免饥饿 好基友Condition。虽然synchronized下同样有Object的wait notify方法,但Condition队列更灵活、更可控。 使用CAS来实现原子操作 使用LockSupport中的park unpark实现阻塞原语 1.1 基本使用 一个老生常谈的多线程自增的例子。由于i++的非原子性,在不采取任何措施的情况下最终的结果是小于等于200000的,为了使最终的结果为200000需要采取措施保障i++不可分割,在i++前后加锁即可。 虽然用synchronized可实现同样的结果,但用重入锁可以自己来加锁解锁,况且还省了一个大括号不是? public class myThread implements Runnable {