`
cuishen
  • 浏览: 297300 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java线程安全隐患

    博客分类:
  • j2se
阅读更多
最近一直在考虑java线程安全的问题,在java的语言体系里面,究竟哪些地方存在线程安全的隐患呢?以下是笔者的一点愚见,欢迎广大网友拍砖!

众所周知:类由两部分组成,方法和变量,我们先说说这个对象的方法:

最有可能引起线程安全问题的当属单例对象的公有方法和类的公有静态方法。据我所知,方法是加载在栈里面执行的,而对于多线程来说,每个线程有它自己的栈,所以我据此推断,单例对象的方法 或者 类的公有静态方法,应该是加载在每个线程自己的栈里面去独立执行的。如果我的推断是正确的,那么不管什么类型的方法,如果不考虑它用的变量,仅仅就方法本身而言,都是线程安全的。

接下来,我们说说变量,变量又分类变量,实例变量,局部变量。

A. 类变量如果是引用的引用类型对象的话,因为是存储在堆里面,是所有线程栈所共享的,所以存在线程安全的隐患,因此程序员要特别当心。

B. 实例变量又可以分为多例对象的实例变量和单例对象的实例变量,如果是引用的引用类型对象的话,它也是存储在堆里面的,是所有线程栈所共享的,但是多例对象的实例变量不存在线程安全问题(这个为什么就不用我解释了吧!),而单例对象的实例变量存在线程不安全的风险,这个大家也要当心!例如最经典的:Servlet对象、以及Struts1里面的Action对象的实例变量就是线程不安全的!

C. 局部变量是方法内部实例化的变量,方法执行完后就被垃圾回收了。局部变量如果是基本类型,是放在线程栈里面的,每个线程无法共享,因此不存在线程安全的问题;如果是对象类型,在Stack里保存地址,在Heap里保存值,只要不去引用外部的单例对象,也不会存在线程安全的问题。换句话说,如果在方法体内部new了一个HashMap,即便HashMap本身是线程不安全的,但是在这种情况下,依然是线程安全的。

分享到:
评论

相关推荐

    Java安全编码培训.pdf

    Java安全编码培训是针对Java开发人员进行的一项专业培训,旨在提升程序员在编写代码时对安全性问题的认识和能力,防止在软件开发过程中引入安全隐患。本次培训涵盖了安全编码的重要性和基本概念,包括安全编码考核...

    java 安全编程指南

    Java作为一种跨平台的编程语言,其安全性是其核心特性之一,但如果不正确地编写代码,可能会引入安全隐患。本指南将深入探讨以下几个关键知识点: 1. **Java安全模型**:Java的安全模型基于沙箱机制,它限制了代码...

    servlet与Struts action线程安全问题分析

    这种设计提高了性能,但也带来了线程安全的隐患。 **线程安全问题示例:** 考虑以下servlet示例: ```java public class ConcurrentTest extends HttpServlet { PrintWriter output; public void service...

    Java安全性编程指南.rar

    11. **线程安全**:多线程编程时,要注意同步和锁机制的使用,防止数据竞争和死锁,确保并发环境下的程序正确性。 12. **日志和审计**:记录并分析程序运行时的信息有助于发现和解决安全问题。适当的安全日志可以...

    Java安全学习项目.zip

    Java提供了synchronized关键字和并发包java.util.concurrent,来保证线程安全和避免竞态条件。 7. **代码签名与证书**:Java的jar文件可以进行数字签名,确保代码来源的可信度和完整性,防止恶意篡改。 8. **Java...

    基于JAVA的安全电子商务(论文).rar

    10. **并发与多线程安全**:JAVA的并发API提供了锁、同步、原子变量等工具,确保多用户访问时的数据一致性,避免并发问题引发的安全隐患。 这篇基于JAVA的安全电子商务论文可能详细分析了以上技术的原理、实施方法...

    JAVA安全编程

    线程安全是多线程Java应用程序中必须考虑的问题。不正确的同步可能导致数据竞争和其他并发问题,从而引入安全风险。了解如何正确使用synchronized关键字、volatile变量以及Lock接口,可以帮助开发者编写出无bug的...

    java多线程反射泛型及正则表达式学习笔记和源码.zip

    反射虽然强大,但使用不当也可能带来安全隐患,如破坏封装性。 泛型是Java SE 5.0引入的新特性,它为类型提供了参数化。泛型的主要目的是提高代码的类型安全性和重用性。使用泛型,可以在编译时检查类型错误,避免...

    线程的挂起、唤醒和终止

    在Java中,最直接的方式是使用`Thread.stop()`方法,但这同样存在安全隐患,因为它可能导致数据不一致和资源泄漏。因此,`Thread.stop()`已被弃用。更安全的方法是通过共享变量或者中断标志来通知线程应该停止执行,...

    Java concurrency in practice

    - **第4章:对象组合**:介绍了设计线程安全类的方法、实例隔离、委托线程安全性和向现有线程安全类添加功能的策略。 - **第5章:构建模块**:覆盖了同步集合、并发集合、阻塞队列、生产者-消费者模式、阻塞和可中断...

    Java安全性编程实例

    12. **代码审计**:定期进行代码审查,检查是否遵循了安全编码的最佳实践,及时发现并修复潜在的安全隐患。 13. **依赖管理和版本控制**:确保使用已知安全的第三方库,并保持其更新,以防止因已知漏洞被利用。 14...

    JAVA项目更新升级程序

    10. **安全性**:升级过程中应考虑系统的安全性,确保新版本不会引入新的漏洞或安全隐患。这包括代码审查、安全扫描和遵循最佳安全实践。 综上所述,"JAVA项目更新升级程序"涵盖了Java Web项目的维护、系统升级的...

    Java高级面试题大全带答案(2021年Java面试题及答案整理)

    但是使用有很多的安全隐患,推荐使用线程池。 * 运行时异常与受检异常有何异同? 六、Java 高级面试题 * 32 位和 64 位的 JVM,int 类型变量的长度是多少?答:32 位和 64 位的 JVM 中,int 类型变量的长度是相同...

    多线程RC4算法加解密

    3. **线程安全**:在多线程环境中,需要注意RC4算法的线程安全问题,例如防止状态数组在同一时刻被多个线程修改,通常可以通过锁机制来解决。 **三、日志输出** 1. **目的**:日志输出有助于追踪程序运行状态,...

    基于JAVA实现的传输光缆隐患预警系统.zip

    综上所述,这个基于Java的传输光缆隐患预警系统旨在通过先进的技术和策略,为维护通信网络的稳定性和安全性提供有力保障,防止因光缆问题导致的通信中断。它体现了Java在实时监控和预警领域的应用潜力,以及在解决...

    java_concurrency_in_practice

    第一部分重点讲解了Java并发的基础知识和技术,包括线程安全、对象共享以及对象组合等。 - **第2章:线程安全** 本章首先定义了什么是线程安全,并通过原子性和锁定机制来实现这一目标。接着介绍了如何利用锁保护...

Global site tag (gtag.js) - Google Analytics