关系性锁:

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();

分布式锁: