码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java中的synchronized、volatile、ThreadLocal


    文章目录

      • synchronized内置锁
        • 用处
        • 对象锁
        • 类锁
        • 对象锁和类锁之间
      • volatile关键字,最轻量的同步机制
      • ThreadLocal的使用

    synchronized内置锁

    用处

    1. 加到方法上面

    2. 以同步块的形式使用

      最大的作用是确保多个线程在同一时刻,只能有一个线程处于方法和同步块之中.

      这样保证了线程对变量访问的可见性和排他性

      synchronized关键字,是由java语言本身为我们提供的,所以说我们习惯性把synchronized关键字称为内置锁.

      synchronized锁的其实是一个具体的对象

      每个对象在内存中会被编译成class文件,内存的对象头上有一个标志位, 标志位上有1~2个字节的锁

      使用synchronized关键字,就是线程去抢那个标志位,谁把标志位指向了自己,谁就抢到了锁,这又产生了对象锁,类锁的概念.

    对象锁

    • 方法直接用synchronuzed关键字修饰的时候

    • 在方法体里面:

      synchronized(this) {
        
      }
      

      的时候.

    • 两个线程同时锁相同的对象,先获得锁那个线程先运行完毕另一个线程才开始运行

    • 两个线程锁不同的对象,意味着两个线程是可以同时进行的.

    类锁

    • 方法定义成static,并使用了synchronized关键字

    对象锁和类锁之间

    • 锁的东西是不一样的
    • 锁不同的对象,锁也是不同的
    • 类对象无论怎么做,虚拟机保证了每个类的class对象有且只有一个

    注:

    • 用Spring框架的时候,Spring框架没有做特殊设置的话,Spring为我们new出的对象实例有且只有一个,这时候用synchronized可以保证锁定是唯一的一个对象.
    • 如果配置了Spring允许new出多个对象,这时候再来加锁的时候千万要注意synchronized关键字锁的会不会是同一个对象.

    volatile关键字,最轻量的同步机制

    • volatile关键字是由虚拟机为我们提供的一个最轻量级的同步机制

    • 某个变量加上volatile关键字后,其实是告诉虚拟机每次要用变量的时候从主内存中读取,

    • volatile在使用的时候,不会对读取写入加锁,所以是最轻量的同步机制,效率也是最高的

    • volatile不是线程安全的,只能保证某个变量的可见性,不能保证变量的原子性

      比如:

      如果是:

      public void setAge(){
        age = age + 20;
      }
      

      的话,虚拟机并不能保证操作是原子性的.

      • 只有一个线程写,多个线程读是volatile最常使用的场景

        jdk源码里,使用volatile关键字的地方相当多

    ThreadLocal的使用

    线程变量

    • 可以确保每个线程他只使用自己那部分的

      在线程里定义一个变量,只要以ThreadLocal包装,可以确保每个线程只会使用自己的一份拷贝

    • 链接池里面会使用ThreadLocal,每一个线程拥有自己独有的链接.

    • Spring事务处理也有用到ThreadLocal

  • 相关阅读:
    5. 最长回文子串
    JavaScript 数组手册 – 通过示例和备忘单了解 JS 数组方法如何工作
    Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本相关命令
    融合迁移学习与文本增强的中文成语隐喻知识识别与关联研究
    Linux·工作队列
    leetcode134.加油站 贪心法求解 (c++版本)
    Mysql(四)------逻辑库和数据表
    muduo库的高性能日志库(一)
    blender从视频中动作捕捉,绑定到人物模型
    高通camera Tuning常见面试题
  • 原文地址:https://blog.csdn.net/gaofenglxx/article/details/119279709
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号