Young Kbt blog Young Kbt blog
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)

Shp Liu

朝圣的使徒,正在走向编程的至高殿堂!
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)
  • 导航栏 - 目录页

  • Java - 目录页

    • JavaSE - 知识体系
    • Collection - 知识体系
    • JUC - 知识体系
    • JVM - 知识体系
    • Java版本新特性 - 知识体系
  • 数据库- 目录页

  • 框架 - 目录页

  • Spring生态 - 目录页

  • 开发 - 目录页

  • 工具 - 目录页

  • 前端 - 目录页

JUC - 知识体系
JUC 是 java.util.concurrent 包的简称,在 Java5.0 添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题。
目录
1. JUC - 概念
2. JUC - Java线程
3. JUC - 共享模型之管程安全
4. JUC - 共享模式之锁基础
5. JUC - 共享模式之锁进阶
6. JUC - 共享模式之内存
7. JUC - 共享模型之无锁
8. JUC - 共享模型之不可变
9. JUC - 共享模型之线程池
10. JUC - 共享模型之读写锁
11. JUC - 共享模式之并发类

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

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

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

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/11/02, 18:07:00
Collection - 知识体系
JVM - 知识体系

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

最近更新
01
技术随笔 - Element Plus 修改包名 原创
11-02
02
Reactor - 扩展性
11-02
03
Reactor - 最佳实践
11-02
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Young Kbt | blog
桂ICP备2021009994号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式