ReentrantLock可重入锁:就是一个线程在获取了锁之后,再次去获取了同一个锁,这时候仅仅是把状态值进行累加
ReentrantLock支持两种获取锁的方式,一种是公平模型,一种是非公平模型。
公平锁:
当A把锁完全释放后,state恢复为0,然后会通知队列唤醒B线程节点,使B可以再次竞争锁,当然,如果B线程后还有C线程,C线程继续休眠,除非B执行完了,通知了C线程。
非公平锁模型
当线程A执行完之后,要唤醒线程B是需要时间的,而且线程B醒来后还要再次竞争锁,所以如果在切换过程当中,来了一个线程C,那么线程C是有可能获取到锁的,如果C获取到了锁,B只能继续休眠。
synchronized关键字 同步锁
1.可以修饰一个代码块,被修饰的代码块成为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
publicvoidmethod(){
synchronized(this) {
// todo
}
}
2.修饰一个方法,被修饰的方法成为同步方法,范围是整个方法,作用的对象是调用这个方法的对象。
publicsynchronizedvoidmethod()
{
// todo
}
3.修饰一个静态的方法,其作用范围是整个静态方法,作用的对象是Class。
public synchronized void method() { }
4.修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
classClassName {
publicvoidmethod() {
synchronized(ClassName.class) {
// todo
}
}
}
参考文章http://blog.csdn.net/yanyan19880509/article/details/52345422