码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java中ReentrantLock测试线程的安全


    使用场景

    当需要在多线程环境下保证共享资源的安全访问时,可以使用Java中的ReentrantLock来实现线程安全。ReentrantLock是一个可重入的互斥锁,它提供了与synchronized关键字类似的功能,但更加灵活和扩展性强。

    下面是一个使用ReentrantLock进行线程安全测试的示例代码:

    1. import java.util.concurrent.locks.ReentrantLock;
    2. public class Singleton04 {
    3. private static int counter = 0;
    4. private static ReentrantLock lock = new ReentrantLock();
    5. public static void main(String[] args) {
    6. // 创建多个线程并启动
    7. for (int i = 0; i < 5; i++) {
    8. Thread thread = new Thread(new CounterRunnable());
    9. thread.start();
    10. }
    11. }
    12. static class CounterRunnable implements Runnable {
    13. @Override
    14. public void run() {
    15. try {
    16. // 获取锁
    17. lock.lock();
    18. // 执行临界区操作
    19. for (int i = 0; i < 10000; i++) {
    20. counter++;
    21. }
    22. // 输出结果
    23. System.out.println("Thread " + Thread.currentThread().getId() + " finished. Counter: " + counter);
    24. } finally {
    25. // 释放锁
    26. lock.unlock();
    27. }
    28. }
    29. }
    30. }

    在上述代码中,我们创建了一个静态的ReentrantLock对象lock作为互斥锁,用于保护共享变量counter的访问。每个线程在执行临界区操作之前,先通过lock.lock()获取锁,然后执行操作,最后通过lock.unlock()释放锁。

    运行该示例代码,可以看到多个线程并发地对counter进行自增操作,并输出每个线程结束后的结果。由于使用了ReentrantLock进行同步,保证了对counter的安全访问,不会出现数据错乱或冲突的情况。

    需要注意的是,在使用ReentrantLock时,一定要在finally块中调用unlock()方法来确保锁的释放,以防止出现死锁的情况。

    总而言之,通过使用ReentrantLock可以实现线程安全的访问共享资源,提供了更灵活和扩展性强的方式来控制多线程的同步。


  • 相关阅读:
    vue3 源码解析(2)— ref、toRef、toRefs、shallowRef 响应式的实现
    智能化物流管理:全国快递物流查询API的角色与优势
    vue实现酷炫可视化大屏
    Python学习 - 垃圾回收、特殊方法和模块
    Mysq优化---mysql安装与配置(Lunix环境)
    java工作内存与主内存之间相互刷新的时机
    饮用水中磷超标的解决方法
    Mysql详细学习笔记
    华为数通方向HCIP-DataCom H12-831题库(多选题:1-20)
    【每日一题】528. 按权重随机选择
  • 原文地址:https://blog.csdn.net/m0_62006803/article/details/134041472
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号