`
jbm3072
  • 浏览: 211220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

这两天遇到代码中出现的两次多线程问题

    博客分类:
  • Java
 
阅读更多

这两天在做两个非常小的项目,就是对现有的代码改改异常处理方式或者显示内容神马的。在修改的过程中,发现了两个线程安全的问题。把这个记下来,算作是对大家工作的提示吧。 

1. 使用static HashMap的问题

代码非常简单,类似是这样子的: 

@Controller
public class MyController {
   private static HashMap<String,String> cachedData = new HashMap<String,String>();
  
   public void processRequest(){
       cachedData.clear();
       cachedData.put("string", "string");
       ........
       mav.addModel("cachedData", cacheData);
   }
}

 这个错误非常明显,因为定义的是Spring的Controller,spring容器的bean默认情况是单例的,这样这个类中的cachedData就会被多个线程同时读和写,cachedData使用的标准的HashMap,不是线程安全的,所以多线程下必然会出现意料不到的结果。 

有人会问,那直接把new HashMap()改成new CocurrentHashMap(),是不是就没有问题了? 依然有问题,尽管不会出现多线程下的CocurrentModificationException, 但可能会出现数据不一致的情况,举个例子来说,线程A写入string=1, 线程B写入string=2,这时Map中string=2,恰好线程A吧map放到model让spring输入,这是必然会变成string=2. 

修改方法:很简单不要使用static的HashMap,也不要把他作为成员变量,把map作为局部变量使用即可。

 

2. 小心使用线程不安全的类

class A {
    private String a; 
    private String b;
    public void setA(String a ){
       this.a = a;
   }

    public void SetB(String b){
       this.b = b;
    }
    
    public void proces(String c, String d){
       if(b==null){
          b=c;
       }
       ......
    }
}

 

这个非常简单的类,在我们写代码的时候,用这样的模式去写,但是在多个线程下使用同一个类的实例时,就会有问题。 当第一个线程调用process时,b=null, 这时候b被设置为c。 但是当第二个线程调用proces时,b已经变成了c,这时候process就会使用第一个线程设置的变量了。这样第二个线程就无法正常的使用,从而得到错误的process方式了。

 

解决方法: 将b设置成一个final的,意味着只有在对象初始化的时候才能给这个变量赋值,以后其他方法都不能给她赋值 。

 

这两个问题虽然很简单,但是一旦出现问题,带来的后果不堪设想。所以大家在写代码的时候,务必注意,你写的类是否会在多线程下使用,如果多线程下使用会不会出现上述问题。

 

 

分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第17天-05.多线程复制-多条跟踪.zip

    在实际的多线程复制过程中,可能会遇到死锁、活锁和饥饿等问题。死锁发生在两个或多个线程相互等待对方释放资源而无法继续执行的情况;活锁则是线程不断地尝试执行但因条件不满足而不断重试,导致系统无法前进;饥饿...

    Java程序设计经典300例随书源代码全

    在遇到问题时,可以对照源代码找出错误,或者通过搜索引擎找到类似问题的解决方案,从而加深理解和记忆。此外,这些代码还可以作为模板,为自己的项目提供灵感和起点。 总之,"Java程序设计经典300例随书源代码全...

    并行计算课程设计(代码+执行文件+文档)

    每一次遇到问题和解决问题都是一种锻炼,一种尝试,从我们上并行计算课我懂得了很多电脑硬件和软件的知识,这些可能对于我们这个专业以后都是没有机会接触的,所以我觉得选择了并行计算与多核多线程技术这门课是非常...

    并行计算课程设计(报告+代码+可执行文件)

    每一次遇到问题和解决问题都是一种锻炼,一种尝试,从我们上并行计算课我懂得了很多电脑硬件和软件的知识,这些可能对于我们这个专业以后都是没有机会接触的,所以我觉得选择了并行计算与多核多线程技术这门课是非常...

    java初学者完整代码+注释 8

    这个压缩包中的“day8”可能包含了第八天的学习内容,可能涵盖上述某些主题的深入讲解或实践例子。对于初学者来说,通过阅读代码和注释,能够更好地理解Java的基本概念和编程技巧。建议按照课程顺序逐步学习,动手...

    【IT十八掌徐培成】Java基础第16天-04.ByteArrayInputStream-ByteArrayOutputStream.zip

    在Java基础第16天的课程中,"IT十八掌徐培成"老师可能会详细讲解如何使用这两个类,包括它们的构造方法、核心方法的使用以及在实际问题中的应用示例。观看这个教程的视频资源(Java基础第16天-04....

    瑞吉外卖第三天讲义资源

    4. **多线程**:外卖系统通常需要处理并发请求,多线程编程在处理订单处理、配送员状态更新等场景中的运用。 5. **网络编程与API接口**:Java的HttpURLConnection或HttpClient库用于与第三方API(如地图服务、支付...

    Advent-of-Code:我遇到的代码挑战的存储库

    这个活动通常在每年的12月份进行,每天发布两个新的编程问题,持续25天,旨在为程序员提供有趣的逻辑和算法难题,以提升他们的编程技巧和解决问题的能力。参与者可以使用任何编程语言来解决这些问题。 在这个名为 ...

    黑莓手机错误提示信息说明.pdf

    这个错误指出在文件系统中发现了无效的代码,可能是由于COD文件(黑莓手机的可执行文件)的签名问题或在生成过程中发生错误。如果文件系统被破坏,唯一的恢复方法是擦除设备并恢复出厂设置。 3. 错误103:Cannot ...

    java内存泄露、溢出检查方法和工具

    在一个Web项目中,部署上线后,服务器在运行两天左右就会报内存溢出错误,具体错误信息如下: ``` java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError: Java heap space ``` 初步...

    双 向 聊 天

    标题中的“双向聊天”指的是一个基于JAVA语言开发的软件应用,它允许...综上所述,这个"双向聊天"项目涵盖了JAVA编程、网络通信、多线程以及用户界面设计等多个方面的知识,是一个不错的学习和实践JAVA技术的实际案例。

    内似QQ聊天室,简单的服务器与客户端通讯

    在这个项目中,可能还会涉及到多线程编程。服务器需要同时处理多个客户端的请求,这就需要用到多线程或者异步IO来提高并发性能。客户端也可能需要开启新线程来处理接收消息,避免阻塞用户界面。 此外,为了实现聊天...

    祝由十三科.pdf

    Java的文化历史始于C++,它汲取了C++的优点,同时解决了C++中的许多问题,如内存管理、多线程安全等。James Gosling是Java的主要设计者,他的目标是创造一种简单、面向对象、健壮且性能优良的语言。Java的名字据说...

    APScheduler-3.0.0-py2.py3-none-any.whl.zip

    它支持多线程和多进程模式,可以在分布式环境中运行。`'none-any'` 在文件名中的含义是指这个包不依赖于任何特定的硬件或操作系统平台,可以在任何兼容的 Python 环境下运行。 综上所述,APScheduler 是一个功能...

    APScheduler-3.0.0b2-py2.py3-none-any.whl.zip

    此外,APScheduler 支持多线程和多进程模式,可以根据需要选择合适的运行方式。它还提供了暂停、恢复、取消任务的能力,以及错误处理机制,可以捕获并处理调度过程中可能出现的异常。 在实际应用中,你可以用 ...

    计算机网络课设-模拟Ethernet帧的发送过程.doc

    一、知识背景 1. 网络协议 网络协议是计算机网络中不同设备之间通信...通过这个课程设计,学生不仅能深入理解以太网的工作原理,还能掌握多线程编程和冲突处理策略,为将来在网络编程领域的学习和实践打下坚实基础。

    c#学习笔记.txt

    volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代...

    java 2 编程21天自学通01

    9. **多线程**:Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类来创建并管理线程,理解同步和互斥的概念,避免并发问题。 10. **网络编程**:Java提供了Socket和ServerSocket类进行TCP/IP通信,...

    C#微软培训资料

    &lt;&lt;page 1&gt;&gt; page begin==================== 目 目目 目 录 录录 ... 11.2 方法中的参数.125 ... 14.2 多 态 性 .159 ... 14.4 继承中关于属性的一些问题.169 ...这一天 微软公司正式推出了其下一代...

Global site tag (gtag.js) - Google Analytics