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方法,具备可重入性