锁机制

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

你可能感兴趣的:(锁机制)