ReentrantLock |
Synchronized |
|
锁实现机制 |
依赖AQS |
监视器模式 |
灵活性 |
支持响应中断、超时、尝试获取锁 |
不灵活 |
释放形式 | 必须显式调用unlock()方法释放锁 |
自动释放监听器 |
锁类型 |
公平锁&非公平锁 |
非公平锁 |
条件队列 |
可关联多个条件队列 |
关联一个条件队列 |
可重入性 |
可重入 | 可重入 |
下面进行伪代码进行比较
//**************synchronized的实现方式****************** // 1、用于代码块 synchronized(this){} // 2、用于实例对象 synchronized(object){} // 3、用于方法 public synchronized void test(){} // 4、可重入 for(int i=0;i<10;i++){ synchronized(this){} } // *********************ReentrantLock使用方式*********************** public void test() throws Exception{ //1、初始化选择公平锁,非公平锁 ReentrantLock lock = new ReentrantLock(true); //2、用于代码块 lock.lock(); try{ try{ //3、支持多种加锁方式,比较灵活,具有可重入特性 if(lock.tryLock(10,TimeUtil.MILLISECONDS)){} }finally{ //4、手动释放锁 lock.unlock(); } } finally{ lock.unlock(); } }
自定义个实现AbstractQueuedSynchronizer 类的同步块
package com.kit.mok; import java.util.concurrent.locks.AbstractQueuedSynchronizer; /** * @author 七彩星星 * @version 1.0 * @date 2021/7/26 16:59 */ public class Aqslock { public static class Sync extends AbstractQueuedSynchronizer { @Override protected boolean tryAcquire(int args) { return compareAndSetState(0, 1); } @Override protected boolean tryRelease(int args) { setState(0); return true; } @Override protected boolean isHeldExclusively() { return getState() == 1; } } private Sync sync = new Sync(); public void lock() { sync.acquire(1); } public void unlock() { sync.release(1); } }
package com.kit.mok; /** * @author 七彩星星 * @version 1.0 * @date 2021/7/26 17:05 */ public class AqsMain { static int count = 0; static Aqslock reentrantLock = new Aqslock(); // static ReentrantLock reentrantLock = new ReentrantLock(false); public static void main(String[] args) throws InterruptedException { Runnable runnable = new Runnable() { @Override public void run() { try { aqslock.lock(); for (int i = 0; i < 10000; i++) { count ++; } } catch (Exception e) { e.printStackTrace(); } finally { aqslock.unlock(); } } }; Thread thread1=new Thread(runnable); Thread thread2=new Thread(runnable); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(count); } }
输出结果: