什么时候考虑线程安全?

简介: 什么时候考虑线程安全?

一、静态变量

静态变量:线程非安全。


静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。


二、实例变量

实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。


实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。


三、局部变量

局部变量:线程安全。

每个线程都有自己独立的调用栈,每个线程执行时将会把局部变量放在各自栈帧的工作内存中。线程间不共享,故不存在线程安全问题。


每个方法在调用栈里都会有自己独立的栈帧,每个栈帧里都有对应方法需要的参数和返回地址。当调用方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出。

我们可以这样说:栈帧是在调用方法时创建,方法返回时“消亡”。


局部变量会存放在栈里。如果一个变量需要跨越方法的边界,就必须创建在堆里。


四、静态方法

静态方法是线程安全的


静态方法如果没有使用静态变量,则没有线程安全问题。为什么呢?因为静态方法内声明的变量,每个线程调用时,都会新创建一份,而不会共用一个存储单元,因此不会有线程安全问题

注意,静态变量,由于是在类加载时占用一个存储区,每个线程都是共用这个存储区的,所以如果在静态方法里使用了静态变量,这就会有线程安全问题!

目录
相关文章
|
存储 缓存 NoSQL
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
262 1
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
|
Windows
Adobe2023全套全网最新稳定版安装包下载
下文软件均为windows系统软件,其中2018版适合windows7/8/10/11系统,2021、2020、2023版适合windows10/11系统。MAC均有!Adobe大法更新到2023版 无论是专业人士还是业余爱好 都毫不犹豫相继尝鲜看看自己竟然还停留在17版 着实感觉到羞愧!
1107 0
|
Java 中间件 微服务
27个阿里 Java 开源项目,值得收藏!
大家好,这里为大家整理了阿里的Java开源项目,希望对大家有所帮助
12610 0
27个阿里 Java 开源项目,值得收藏!
|
缓存 前端开发 Java
SpringBoot&SpringMVC统一异常处理之RestControllerAdvice
SpringBoot&SpringMVC统一异常处理之RestControllerAdvice
285 0
|
存储 缓存 数据库
解决缓存与数据库的数据一致性问题的终极指南
解决缓存与数据库的数据一致性问题的终极指南
616 63
|
存储 分布式计算 大数据
大数据的工具都有哪些?
【10月更文挑战第9天】大数据的工具都有哪些?
1057 1
|
9月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
408 2
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
11月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
11月前
|
域名解析 存储 缓存
DNS是什么?内网电脑需要配置吗?
【10月更文挑战第22天】DNS是什么?内网电脑需要配置吗?
1927 1
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
158 0
rabbitmq基础教程(ui,java,springamqp)