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

Java线程安全隐患

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

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

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

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

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

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

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

分享到:
评论

相关推荐

    寿星天文历Java版源码

    1. 我仅仅翻译了月历和气朔中定气的部分,不包括日月食、地方食、星历等。...5. java版本代码是有js直接翻译而来的,因此代码中都是js的编程风格,很多变量的运用方式我认为都有隐患,因此不排除在多线程情况下含有bug

    Java 并发编程学习笔记之Synchronized简介

    虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致...今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。

    Java如何优雅的实现时间控制

    前言:需求是这样的,在与第三方对接过程中,对方提供了token进行时效性验证,过一段时间...虽然这种方式可以,但是存在一个隐患,如果在多线程环境下,线程很容易被interrupt,这样代码就会抛出异常,这样线程就会挂

    WhCannon#JavaSE#例31.MD

    # 多线程下的单例设计模式### 饿汉式(无安全隐患)private static final Single s = new Single();public s

    Tomcat面试专题及答案.pdf

    bio:传统的 Java I/O 操作,同步且阻塞 IO。 maxThreads=”150”//Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的线程数。默认值 200。可以根据机器的时期性能和内存 大小调整,一般可以...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    C .Iterator进行元素的删除操作,绝对是线程安全的。 D .Java无法实现在遍历时,进行删除元素操作。 多选 11.关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》:ABD ...

    java版斗地主源码-px:精心设计的多进程游戏服务器

    node作为脚本语言性质,决定了它不适合做高cpu的业务,不同于java之类采用的是单线程,多进程的模式来处理海量请求。每个进程其实和传统web服务器一样都是镜像一般处理相同业务(登录,聊天,战斗,交易等等),这样...

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

    基础篇》涵盖了作者数年来在移动开发领域所积累的经验,以及成功进行移动项目开发所需的全部概念和实用技术,包括移动开发过程与传统软件开发的区别,还包括帮助你节约宝贵时间和规避隐患的技巧。不管你的项目有多大...

    MySQL命令大全

    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...

    MYSQL常用命令大全

    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...

Global site tag (gtag.js) - Google Analytics