Java锁机制-重入锁

锁的种类:

读写锁   悲观锁  乐观锁 CSA无锁  自旋锁  AQS 非公平锁 公平锁 互斥锁 排它锁  分布式锁(redis实现 和 zk实现)

轻量级锁(lock),重量级锁(synchronize)

 

重入锁

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。

重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

锁的特征是可以传递的,锁是可以传递的,是方法递归进行传递 。是为了避免死锁问题的

 

在JAVA环境下 ReentrantLock(显式锁、轻量级锁)和Synchronized (内置锁、重量级锁)都是 可重入锁

 废话不多说,ReentrantLock(显式锁、轻量级锁):

package SuoTest;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ChongruTest extends Thread {
   
    Lock lock =new ReentrantLock();
    
      @Override
    public void run() {
        set(); 
        
    }
    
   public  void  set(){
       try {
           lock.lock();
           System.out.println("set方法");
           get();
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        lock.unlock();
    }
      
   }
   public  void get(){
       System.out.println("lock 可以具备可重入性-get方法");
       try {
        lock.lock();
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        lock.unlock();
    }
   }
      
    public static void main(String[] args) {
        ChongruTest chongruTest =  new ChongruTest();
        chongruTest.start();
    }
}


运行结果:

 

Synchronized (内置锁、重量级锁):

 正常情况下释放锁的条件是 异常或者代码运行完毕  

package SuoTest;

public class SynchronizeTest implements Runnable{
    public void run() {
        set();
    }
    public synchronized void set(){
        System.out.println("set方法");
        get();
    }
    public synchronized void get(){
        System.out.println("get方法");
    }
    
    public static void main(String[] args) {
        SynchronizeTest synchronizeTest = new SynchronizeTest();
        Thread t1 =  new Thread(synchronizeTest);
        t1.start();
        
    }
    
} 

set方法把锁传递给了get方法,具备可重入性

 

posted @ 2018-10-26 15:34  toov5  阅读(1731)  评论(0编辑  收藏  举报