java线程安全问题之静态变量、实例变量、局部变量

YOLO26涨点改进 | 全网独家创新、检测头Head改进篇 | AAAI 2026 | 使用StripConvHead改进YOLO26的检测头,处理小目标、遮挡小目标检测有效涨点,助力高效发论文 🔥本文给大家介绍使用StripConv条形卷积改进 YOLO26的检测头,可以显著提高模型在高纵横比物体检测、目标定位和多尺度物体检测方面的表现。StripConv条形卷积能够更有效地捕捉细长物体的特征,提升定位精度,并通过简化卷积核设计减少计算冗余,优化计算效率。此外,该改进增强了 YOLO26对复杂场景和实时任务的适应能力,特别适用于遥感图像目标检测、小目标检测等领域。具体怎么使用请看全文。摘要:随着遥感物体检测的快速发展,检测高纵横比物体仍然是一个挑战性问题。 阅读详情

java线程安全问题之静态变量、实例变量、局部变量

转载  2012年12月14日 15:08:06

 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:

写道
给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 

 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!

 

静态变量:线程非安全。

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

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

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

局部变量:线程安全。

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

 

静态变量线程安全问题模拟:

----------------------------------------------------------------------------------

Java代码   收藏代码
  1. /**  
  2.   * 线程安全问题模拟执行  
  3.   *  ------------------------------  
  4.   *       线程1      |    线程2  
  5.   *  ------------------------------  
  6.   *   static_i = 4;  | 等待  
  7.   *   static_i = 10; | 等待  
  8.   *    等待          | static_i = 4;  
  9.   *   static_i * 2;  | 等待  
  10.   *  ----------------------------- 
  11.  * */  
  12. public class Test implements Runnable  
  13. {  
  14.     private static int static_i;//静态变量   
  15.       
  16.     public void run()  
  17.     {  
  18.         static_i = 4;  
  19.         System.out.println("[" + Thread.currentThread().getName()  
  20.                 + "]获取static_i 的值:" + static_i);  
  21.         static_i = 10;  
  22.         System.out.println("[" + Thread.currentThread().getName()  
  23.                 + "]获取static_i*3的值:" + static_i * 2);  
  24.     }  
  25.       
  26.     public static void main(String[] args)  
  27.     {  
  28.         Test t = new Test();  
  29.         //启动尽量多的线程才能很容易的模拟问题   
  30.         for (int i = 0; i < 3000; i++)  
  31.         {  
  32.             //t可以换成new Test(),保证每个线程都在不同的对象中执行,结果一样   
  33.             new Thread(t, "线程" + i).start();  
  34.         }  
  35.     }  
  36. }  

 

 

根据代码注释中模拟的情况,当线程1执行了static_i = 4;  static_i = 10; 后,线程2获得执行权,static_i = 4; 然后当线程1获得执行权执行static_i * 2;  必然输出结果4*2=8,按照这个模拟,我们可能会在控制台看到输出为8的结果。

写道
[线程27]获取static_i 的值:4 
[线程22]获取static_i*2的值:20 
[线程28]获取static_i 的值:4 
[线程23]获取static_i*2的值:8 
[线程29]获取static_i 的值:4 
[线程30]获取static_i 的值:4 
[线程31]获取static_i 的值:4 
[线程24]获取static_i*2的值:20

 看红色标注的部分,确实出现了我们的预想,同样也证明了我们的结论。

 

实例变量线程安全问题模拟:

----------------------------------------------------------------------------------

Java代码   收藏代码
  1. public class Test implements Runnable  
  2. {  
  3.     private int instance_i;//实例变量  
  4.       
  5.     public void run()  
  6.     {  
  7.         instance_i = 4;  
  8.         System.out.println("[" + Thread.currentThread().getName()  
  9.                 + "]获取instance_i 的值:" + instance_i);  
  10.         instance_i = 10;  
  11.         System.out.println("[" + Thread.currentThread().getName()  
  12.                 + "]获取instance_i*3的值:" + instance_i * 2);  
  13.     }  
  14.       
  15.     public static void main(String[] args)  
  16.     {  
  17.         Test t = new Test();  
  18.         //启动尽量多的线程才能很容易的模拟问题   
  19.         for (int i = 0; i < 3000; i++)  
  20.         {  
  21.             //每个线程对在对象t中运行,模拟单例情况  
  22.             new Thread(t, "线程" + i).start();  
  23.         }  
  24.     }  
  25. }  

 

 

按照本文开头的分析,犹如静态变量那样,每个线程都在修改同一个对象的实例变量,肯定会出现线程安全问题。

写道

[线程66]获取instance_i 的值:10 
[线程33]获取instance_i*2的值:20 
[线程67]获取instance_i 的值:4 
[线程34]获取instance_i*2的值:8 
[线程35]获取instance_i*2的值:20 
[线程68]获取instance_i 的值:4

 

看红色字体,可知单例情况下,实例变量线程非安全。

 

将new Thread(t, "线程" + i).start();改成new Thread(new Test(), "线程" + i).start();模拟非单例情况,会发现不存在线程安全问题。

 

 

局部变量线程安全问题模拟:

----------------------------------------------------------------------------------

 

Java代码   收藏代码
  1. public class Test implements Runnable  
  2. {  
  3.     public void run()  
  4.     {  
  5.         int local_i = 4;  
  6.         System.out.println("[" + Thread.currentThread().getName()  
  7.                 + "]获取local_i 的值:" + local_i);  
  8.         local_i = 10;  
  9.         System.out.println("[" + Thread.currentThread().getName()  
  10.                 + "]获取local_i*2的值:" + local_i * 2);  
  11.     }  
  12.       
  13.     public static void main(String[] args)  
  14.     {  
  15.         Test t = new Test();  
  16.         //启动尽量多的线程才能很容易的模拟问题  
  17.         for (int i = 0; i < 3000; i++)  
  18.         {  
  19.             //每个线程对在对象t中运行,模拟单例情况   
  20.             new Thread(t, "线程" + i).start();  
  21.         }  
  22.     }  
  23. }  

 

 

控制台没有出现异常数据。

 

---------------------------------------------------------------

以上只是通过简单的实例来展示静态变量、实例变量、局部变量等的线程安全问题,

并未进行底层的分析,下一篇将对线程问题的底层进行剖析。


静态方法是线程安全的

先看一个类

public class  Test{

public static  String hello(String str){

    String tmp="";

    tmp  =  tmp+str;

   return tmp;

}

}

hello方法会不会有多线程安全问题呢?没有!!

静态方法如果没有使用静态变量,则没有线程安全问题。

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

 

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

总结:只要方法内含有静态变量,就是非线程安全的
 
Allen_Zhao_2012
  • Allen_Zhao_2012
    2016-12-06 21:587楼
  • 关于静态方法是线程安全的解释,主要其实还是看一点:线程安全核心是对对象的共享的可变的状态的管理方法的处理。如果一个方法没有涉及到对象的状态,可定是线程安全的。
vvw666
u013238950
  • u013238950
    2015-12-26 20:095楼
  • 单例模式一般被定义为线程安全的
ch1390904458
  • ch1390904458
    2015-11-13 15:484楼
  • 谢谢博主,我都试过了 确实是这样,之前学习了一点java内存管理,看线程方体会会深一些。课件 java真的是很深奥,越学越觉得会的很少
baidu_20228769
AUTOSAR-WdgM篇 Wdg通常有两种:一种是芯片内部自带的片内看门狗,另一种是在芯片外部通过SPI这种接口连接的片外看门狗。MCAL只负责常用的有MCU内部看门狗,片内看门狗的特点是Wdg模块是直接访问相关硬件寄存器。内部看门狗依赖于系统时钟片外看门狗属于设备抽象层负责,通常需要使用MCAL提供的其他模块(比如SPI,DIO,PWM等)来访问/控制外扩看门狗芯片。这种不能直接访问硬件寄存器。Wdg Driver:有三种模式slow mode,fast mode ,off mode。 阅读详情

相关推荐

告别抓瞎!手把手教你用Keysight Infinium和M8040完成PCIe 5.0 TX/RX信号完整性测试

本文详细介绍了如何使用Keysight Infinium示波器和M8040误码仪完成PCIe 5.0 TX/RX信号完整性测试。从测试前的设备准备、软件配置到具体的TX信号测试步骤和RX容限测试实战,提供了全面的操作指南和常见问题解决方案,帮助工程师高效完成PCIe 5.0合规性测试。

weixin_30911451的博客 503

java全局变量导致的线程安全问题

3. 落库结果如下,会出现两个一样的结果,因为两个线程用的是同一个对象。2.这是一个公共的解析类。由第一步开始两个线程去跑,代码后面是给对象赋值,落库。一个人的数据跑到了另一个人的里面。4.解决方法,把全局变量改成局部变量就可以了。1.测试复现,通过反射获取到同一个解析类。

hahahahaoooo的博客 539

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1190

多线程下环境中的类变量使用

展示了在没有适当同步机制的情况下修改实例变量可能导致的问题:问题在于,当多个线程同时调用 increment() 方法时,由于没有同步机制来保护 count 的访问,可能会发生竞态条件(Race Condition):由于 increment() 方法没有进行同步,多个线程可能会同时读取和修改 count 变量,导致计数不准确。不一致的状态:如果一个实例变量在多个方法中被修改,但没有进行适当的同步或控制,可能会导致实例变量的值在不同的地方出现不一致的情况。这可能导致程序行为的不确定性或错误的结果。

陌若 1217

一文解读DeepSeek训练数据集

本文重点以DeepSeek为例,详细介绍预训练数据集相关内容。大语言模型LLM(如DeepSeek、ChatGPT、文心一言等)的“智慧”源于它们学习的海量数据集。简单来说,数据集就是模型的“知识库”,通常由互联网公开的文本、图片、视频等。这些数据需满足两个特点:规模大和多样性。规模大是指数据量可达千亿级词汇,让模型学习复杂规律;多样性则涵盖多领域(如科技、文学)、多语言、多形式(对话、新闻),帮助模型适应不同场景。例如,训练数据中既有百科知识,也有日常对话,模型才能既解答专业问题,又能闲聊。

u013891230的博客 7084

Keil中搭建自动化单元测试框架Unity

前言:   虽然一些C++的自动化单元测试框架也能用来C语言单元测试,但那样我们编写C语言程序时需要符合C++的标准,这样有一些C的特性是无法使用的,限制C的特性使用不太好,于是找了一个全部用C实现的自动化测试框架。Unity是一个简单且直接的自动化单元测试框架,它由很少的几个文件构成。 搭建环境:   1.从github上下载最新版本的Unity源码,下载链接:https://github...

程序员的自我修炼 3899

java静态变量线程安全_(转)java线程安全问题之静态变量、实例变量、局部变量...

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安全。...

weixin_39694016的博客 372

ADS 2024实战:手把手教你搞定2.3-3.5GHz宽带Doherty功放仿真与版图(附源文件)

本文详细解析了在ADS 2024环境中实现2.3-3.5GHz宽带Doherty功放的全流程设计,包括仿真与版图实现。从软件环境搭建、器件模型导入到核心电路设计、匹配网络优化,再到系统集成与版图生成,提供了实战技巧和关键参数设置。特别针对5G通信和卫星应用中的高效率需求,展示了如何通过ADS 2024的新功能提升设计效率。

weixin_42639246的博客 460

java 全局变量线程安全_Java线程安全问题指的是全局变量,还是静态变量?

这个问题的答案是静态变量和全局变量都可能引起线程安全问题。这两种变量引起线程安全问题的原因和区别如下:1、静态变量静态变量即静态成员变量。只要有修改变量值的操作,无论是在单例或者非单例都是线程不安全的;而如果线程只是读取变量的值,而不会改变变量的值,这种情况下则是线程是安全的。产生线程安全问题的原因:静态变量即类变量,只初始化一次,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他...

weixin_36217058的博客 2497

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1184

innovus获取mem pin shape box脚本

innovus mem 的pin shae只能通过attitude editor看属性获取其pin shape的box,但是想用脚本处理一定box时,没有别的办法能直接获取box属性。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1108

java静态变量线程安全_java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安全。...

weixin_36416921的博客 1657

【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用方法、阅读顺序、创新思路、文章汇总、源码汇总、数据集汇总等。总之,【图像拼接论文相关】看这一篇就够了

为什么会有这篇文章?因为专栏简介里写不下太多东西,只能通过这篇文章和大家交流,算是一个专栏阅读指南吧。说点心里话本来吧,我只想用优快云来记录自己学习【图像拼接】领域论文的过程,对每篇文章有个细致的理解,方便自己反复查阅。设置为付费也是因为涉及论文和本人其他项目需要,防止查重和其他问题,所以价格最开始设置的是专栏付费价格里最高的。起初,确实没有人看,一切也都平淡地度过着。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4万+

java 线程安全问题之静态变量、实例变量、局部变量

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> ...

在路上2017的专栏 133

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java 静态变量_java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安...

weixin_39756416的博客 115

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【无标题】java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说: 写道 给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全。 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,

daringdart的专栏 451

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java 修改类的静态变量_java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安...

weixin_39870150的博客 427

java线程局部变量单例_java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安全。...

weixin_42171208的博客 185

静态对象线程java_java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:线程非安全。...

weixin_33122947的博客 200

Java线程安全问题之静态变量、实例变量、局部变量

关于线程安全的问题,一直缺的是总结性的东西,下面分享两篇文章,对于静态变量、实例变量、局部变量的线程的安全问题总结的相当全面,如有遗漏和错误的地方也希望大家指正出来,弥补知识盲区。 转自:http://longw.blog.51cto.com/6475045/1683360 线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访...

anyway8090的博客 1091
上一篇: 局部变量线程安全的理解
下一篇: Tomcat源码分析(二)------ 一次完整请求的里里外外
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值