ReentrantLock和Synchronized简单比较

简介: ReentrantLock和Synchronized简单比较

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

输出结果:

目录
相关文章
|
缓存 JavaScript 数据可视化
echarts在vue3中的使用——其他页面跳转回echarts图表页面时,不显示图表的问题
echarts在vue3中的使用——其他页面跳转回echarts图表页面时,不显示图表的问题
1211 0
|
Shell
mac 使用code命令打开VSCode
我们在mac的终端可以使用 open .打开文件夹 如果我们想用vs-code打开文件夹,用的命令是 code .,不过你得先按照code 安装code:打开VSCode –> command+shift+p –> 输入shell command –...
6004 0
|
SQL 缓存 Java
SpringBoot系列教程JPA之update使用姿势
上面两篇博文拉开了jpa使用姿势的面纱一角,接下来我们继续往下扯,数据插入db之后,并不是说就一层不变了,就好比我在银行开了户,当然是准备往里面存钱了,有存就有取(特别是当下银行利率这么低还不如买比特币屯着,截止19年6月22日,btc已经突破1.1w$,可惜没钱买😭)这就是我们今天的主题,数据更新--update的使用姿势
1472 0
SpringBoot系列教程JPA之update使用姿势
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
769 14
|
消息中间件 SQL 分布式计算
大数据-62 Kafka 高级特性 主题 kafka-topics相关操作参数 KafkaAdminClient 偏移量管理
大数据-62 Kafka 高级特性 主题 kafka-topics相关操作参数 KafkaAdminClient 偏移量管理
286 6
|
数据采集 数据挖掘 数据库
单细胞分析 | 使用 Monocle 3 进行发育轨迹分析
单细胞分析 | 使用 Monocle 3 进行发育轨迹分析
1488 0
单细胞分析 | 使用 Monocle 3 进行发育轨迹分析
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
367 0
|
存储 Cloud Native Serverless
云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
阿里云OSS对象存储方案利用函数计算FC,在不同终端请求时实时处理OSS中的原图,减少衍生图存储,降低成本。
|
缓存 安全 数据库
设计与实现图书管理系统的技术挑战
设计与实现图书管理系统的技术挑战