当前位置: 首页 > news >正文

Java并发 | 15.[基础] 线程安全分析

文章目录

  • 1. 线程安全概念
  • 2. 分析一段代码块是否是线程安全的
    • 基本分析
    • 不可变类线程安全问题
  • 参考资料

1. 线程安全概念

上文提到,「多个线程」「读写」「共享资源」时发生了指令交错,就可能出现线程安全问题。

2. 分析一段代码块是否是线程安全的

根据线程安全问题出现的条件,可以从以下三个角度分析:

  • [多个线程] 如果这段代码块不会被多线程执行,那必然是线程安全的;
  • [读写] 若这段代码块只读,那必然是线程安全的;
  • [共享资源] 若这段代码涉及的资源不共享(eg:线程私有),那必然是安全的。

总的来说,看 多线程操作的是否为同一个共享资源,即可判断是否线程安全。

基本分析

public class Test{
    static int param1 = 0;
    int param2 = 0;

    // 该方法对共享资源param1执行了读写,不安全
    public void unsafeFunction1(){
        param1 += 1;
    }
    // 同上
    public void unsafeFunction2(){
        param2 += 1;
    }
    // 操作只读,因此是安全的
    public void safeFunction1(){
        System.out.println(param1);
    }
    // param3是局部变量,不会被外部访问,因此是安全的
    public void safeFunction2(){
        int param3 = 0;
        param3 += 1;
    }
}

不可变类线程安全问题

String、Integer等都是不可变类,这些类底层数据是被 final 修饰的,所有的操作要么只读,要么创建一个新的对象,因此它们的方法都是线程安全的。

参考资料

[视频] 04.014-线程安全分析

[视频] 04.015-线程安全分析-局部变量

[视频] 04.016-线程安全分析-局部变量引用

[视频] 04.017-线程安全分析-局部变量-暴露引用

[视频] 04.018-线程安全分析-常见类-组合调用

[视频] 04.019-线程安全分析-常见类-不可变

[视频] 04.020-线程安全分析-实例分析1~3

[视频] 04.021-线程安全分析-实例分析4~7

相关文章:

  • 【web-攻击应用程序框架】(12.1)分层架构:攻击与保障
  • java计算机毕业设计技术交流网站源码+数据库+系统+lw文档+mybatis+运行部署
  • iPhone没有收到iOS16最新版的推送,如何升级系统?
  • 人工神经网络算法的应用,人工神经网络算法步骤
  • 极智Paper | YOLOv7 更高 更快 更强
  • 大型在线考试答题系统源码 B/S架构
  • Uniswap 顶流之路:机制、决策与风险分析
  • Human-level control through deep reinforcement learning
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • 罗氏线圈在有源滤波中的应用
  • JVM学习(宋红康)之运行时数据区之虚拟机栈中栈帧的动态链接及方法调用
  • 基于FPGA的LCD1602驱动(含代码)
  • 高并发场景下,6种方案,保证缓存和数据库的最终一致性!
  • Elasticsearch HTTP查询
  • ArkID开源IDaaS系统插件OAuth2轻松实现单点登录安心做应用服务集成
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • AHK 中 = 和 == 等比较运算符的用法
  • CentOS从零开始部署Nodejs项目
  • Fundebug计费标准解释:事件数是如何定义的?
  • git 常用命令
  • Gradle 5.0 正式版发布
  • linux安装openssl、swoole等扩展的具体步骤
  • nginx 负载服务器优化
  • node入门
  • PHP变量
  • React组件设计模式(一)
  • Redash本地开发环境搭建
  • spring boot下thymeleaf全局静态变量配置
  • SwizzleMethod 黑魔法
  • ubuntu 下nginx安装 并支持https协议
  • 创建一种深思熟虑的文化
  • 分享一份非常强势的Android面试题
  • 构建工具 - 收藏集 - 掘金
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 入手阿里云新服务器的部署NODE
  • 实现菜单下拉伸展折叠效果demo
  • 算法之不定期更新(一)(2018-04-12)
  • 我是如何设计 Upload 上传组件的
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一份游戏开发学习路线
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #### go map 底层结构 ####
  • #pragma pack(1)
  • (3)STL算法之搜索
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (LeetCode 49)Anagrams
  • (二)fiber的基本认识
  • (二十四)Flask之flask-session组件
  • (三)uboot源码分析
  • (一一四)第九章编程练习
  • (转)visual stdio 书签功能介绍
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .apk文件,IIS不支持下载解决
  • .net CHARTING图表控件下载地址
  • .net core 6 集成和使用 mongodb