码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Lock锁


    一:Lock锁的含义

    ●Lock也是Java中锁的一大家族。同synchronized一样,保证操作的原子性。
    ●Lock是一个接口,两个直接实现类:ReentrantLock(重入锁),ReentrantReadWriteLock(读写锁)。

    ●Lock锁,使用时手动获取锁和释放锁,比synchronized更加灵活;可中断的获取锁;超时获取锁。
    ●ReentrantLock的底层是AQS队列[Abstract Queued Synchronizer队列同步器],AQS队列的底层是一种先入先出队列。具有可冲入,
        公平/非公平锁的特点,其底层具有一种工作窃取算法用来提高工作效率。 

    非公平锁会抢占锁资源,执行效率会更高。

    工作窃取:当一个线程是空闲时,它会监听哪一个线程是繁忙的,主动去帮助繁忙的线程。

       
    ●可重入:属于锁的一种特性。线程在完成任务后,会判断是否能够拿到下一次使用资源的机会。如果可以,就继续占用锁(锁的变量自增),不放弃对当前锁的占用。当锁的变量为0时,B和C就可以使用锁了。
    ●公平/非公平锁:核心的区别就是抢占。

    ●ReentrantLock和Synchronized的区别:可以实例化对象;含有更多丰富的方法;

    二:Lock锁案例

    1. package com.zc;
    2. import java.util.concurrent.locks.Lock;
    3. import java.util.concurrent.locks.ReentrantLock;
    4. import com.sun.org.apache.bcel.internal.generic.NEW;
    5. public class Test09 implements Runnable{
    6. Lock lock1=new ReentrantLock();
    7. private int ticketNum=100;
    8. @Override
    9. public void run(){
    10. lock1.lock();
    11. long l1=System.currentTimeMillis();
    12. for(int i = 0; i < 20; i++) {
    13. System.out.println(Thread.currentThread().getName()+" : "+i);
    14. try {
    15. Thread.sleep(100);
    16. } catch (InterruptedException e) {
    17. // TODO: handle exception
    18. e.printStackTrace();
    19. }
    20. }
    21. lock1.unlock();
    22. }
    23. public static void main(String[] args) {
    24. Test09 t1=new Test09();
    25. new Thread(t1,"张丹").start();
    26. new Thread(t1,"李思").start();
    27. new Thread(t1,"王吴").start();
    28. }
    29. }

    lock():获得锁

    trylock():只有在调用时它不被另一个线程占用才能获取锁。

    unlock():线程无响应时,尝试释放此锁。

    三:某个Java技术实现线程安全的原理是什么?

    》悲观锁ReentrantLock和Synchronized.才能保证原子性操作,创建互斥区。

    》还有一些可以向线程安全方向优化的技术。比方说,乐观锁的思想,CAS理论,volatile.

  • 相关阅读:
    android代码中打开系统设置界面(无线和网络设置,日期和时间设置, 辅助功能设置,电池信息)
    计算机算法与分析--算法实现题1
    解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误
    高效MMdetection(3.1.0)环境安装和训练自己数据集教程(实现于Linux(ubuntu),可在windows尝试)
    《棒球动漫》:无愧的青春·棒球1号位
    【论文阅读】DynaPosGNN: Dynamic-Positional GNN for Next POI Recommendation
    Java核心知识点整理大全5-笔记
    shell脚本中export命令未生效,原因详解
    如何保障 MySQL 和 Redis 的数据一致性?
    数据库选择题笔记
  • 原文地址:https://blog.csdn.net/weixin_52014130/article/details/127089573
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号