一、synchroinized 的功能扩展:重入锁
jdk6.0以后,重入锁和synchronized之间的性能差距已经不大了。
1、ReentrantLock的使用:
lock.lock(); //加锁 ... lock.unlock(); //释放锁
优点: a、有明显的操作工程,开发人员手动指定何时加锁,何时释放锁。灵活性好。
b、一个线程可以连续多次获得同一把锁,即多次调用 lock()方法。
c、可以中断处理: synchronized 要么得到锁继续执行,要么保持等待。
ReentrantLock: synchronized的这两种状态外,还可以取消对锁的请求,即不再等待了。
d、ReentrantLock.lockInterruptibly() 方法: 可以对中断进行响应的锁申请动作,即在等待锁的过程中 可以响应中断。
2、公平锁, new ReentrantLock(true), 根据系统的调度,一个线程会倾向于再次获得已经持有的锁。
这种方式是高效的,但毫无公平性可言。
3、重入锁的几个重要方法:
a、lock(); 获得锁,如果锁已经被占用,则等待。
b、unlock(); 释放锁
c、tryLock(): 尝试获得锁,如果成功,则返回 true, 失败返回false。该方法不等待,立即返回。
d、tryLock(long time, TimeUnit unit): 在给定的时间内尝试获得锁。
4、Condition 条件:
a、await(): 使当前线程等待,同时释放当前锁,当其他线程中使用 signal()或signalAll()方法时,线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。与Object.wait()的方法很相似(哪里不同?)
b、awaitUninterruptibly()方法与 await()方法基本相同,但是它并不会再等待过程中响应中断。
c、singal()方法用于唤醒一个在等待中的线程。相对的singalAll()方法会唤醒所用在等待中的线程。
5、Semaphore 信号量:可以指定多个线程,同时访问某一个资源。
问题:
1、CAS操作?
2、阻塞原语:park(), unpark()。