关系性锁:

Lock:

  锁可以保证线程的执行是安全的,使线程在执行时,只有执行完一个线程才能执行其他线程。任何时刻只有一个线程才能进入临界区,一旦一个线程封锁了锁对象,其他线程将无法通过lock语句。锁是可重入的,线程可以重复获得持有的锁。锁保持一个持有计数来跟踪锁的嵌套调用。每一次调用lock都要调用unlock来释放锁。

  1、基本步骤   

  Lock myLock = new ReentrantLock();

  public void method(){

    myLock.lock();

    try{

      ........

      }

      finally{

      myLock.unlock();

      }

  2、条件对象

    当线程在执行前会获得一个条件对象,此时会判断该线程在执行时,会判断是否符合条件,如果不符合执行条件,会进入阻塞队列,等待其他线程执行其他程序,使阻塞队列的线程唤醒。唤醒之后,退出同步方法。

    public Class LockTest{

      Lock myLock = ReentrantLock();

      Condition sufficient = myLock.newCondition();

    public void method(){

      myLock.lock();

      try{

        while(条件){

          sufficient.await();

          }

        .........

        sufficient.signalAll();

        }

        finally{

          myLock.unlock();

          }

      }  

synchronized关键字: 

       synchronized是一个内部锁,每一个对象都含有该锁,同时可以使用wait()来阻塞不符合条件的线程,使用notifyAll解除所有阻塞的锁。

    使用步骤:

    public void synchronized method(){

      while(条件){

        wait();

        }  

        .......

      notifyAll();

      }

读/写锁:

    写锁只允许一个线程在操作,读锁允许所有读线程进行操作。

    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    Lock read = lock.readLock();

    Lock write = lock.writeLock();

分布式锁: