泪伤荡的编程指南 泪伤荡的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
  • 导航栏

    • Java - 知识体系
    • 计算机基础 - 知识体系
  • Java 目录页

    • JavaSE - 知识体系
    • Collection - 知识体系
    • JUC - 知识体系
    • JVM - 知识体系
    • Java版本新特性 - 知识体系
    • JavaSE - 知识体系
  • 计算机基础目录页

    • JavaSE - 知识体系
    • Collection - 知识体系
    • JUC - 知识体系
    • JVM - 知识体系
JUC - 知识体系
JUC 是 java.util.concurrent 包的简称,在 Java5.0 添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题。
目录
1. 数据结构基础小结
# 2. 基础篇
2-1. 学前须知 2-2. 复杂度 2-3. 动态数组 2-4. 链表 2-5. 栈 2-6. 队列 2-7. 二叉树 2-8. 二叉搜索树 2-9. AVL树 2-10. B树 2-11. 红黑树 2-12. 集合 2-13. 映射 2-14. 哈希表 2-15. 二叉堆 2-16. 优先级队列 2-17. 哈夫曼树 2-18. Tire 2-19. 总结
# 3. 力扣篇
3-1. 刷题小记 3-2. 解法描述
# 3-3. Hot100题解
3-3-1. 简单篇 3-3-2. 中等篇(上) 3-3-3. 中等篇(中) 3-3-4. 中等篇(下) 3-3-5. 困难篇

别轻易使用成员变量,因为多线程会导致成员变量成为共享的资源,可能导致成员变量被多个线程进行修改,不安全。

所以能使用局部变量,就使用局部变量,大部分情况下,它是线程安全的。

什么时候局部变量不安全呢?发生了逃逸,即局部变量脱离所在的作用域,出现在其他方法里被使用,可能导致子类继承父类重写该方法,导致该局部变量被其他线程共享,如下:

public abstract class Father {

    public void bar() {
        // 是否安全
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        foo(sdf);
    }

    public void foo(SimpleDateFormat sdf);

    public static void main(String[] args) {
        new Test().bar();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

一个子类继承 Test,重写 foo 方法

public class Son extends Father{
  public void foo(SimpleDateFormat sdf) {
      String dateStr = "1999-10-11 00:00:00";
      for (int i = 0; i < 20; i++) {
          new Thread(() -> {
              try {
                  sdf.parse(dateStr);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
          }).start();
      }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

sdf 对象在 main 线程的 bar 方法创建,却在子类的另一个线程执行 parse 方法,所以线程不安全。

线程不安全概念:一个对象在当前线程被使用时,另一个线程也在使用该对象,导致不安全。

解决 foo 线程不安全方法(局部变量在多个方法间传递问题)就是设置方法为 private,这样就不会被子类重写。

上次更新: 2024/12/12 01:42:01
Collection - 知识体系
JVM - 知识体系

← Collection - 知识体系 JVM - 知识体系→

Theme by Vdoing | Copyright © 2024-2025 泪伤荡 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式