码迷,mamicode.com
首页 > 其他好文 > 详细

高并发下的static类成员可能存在安全隐患

时间:2017-10-07 16:11:29      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:多个   col   for   sim   java   oop   竞争   recommend   实例   

有一个网友在高并发下使用下面的日期转换工具类时,遇到的问题

public class DateUtil

{

private DateUtil(){

}

private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public static Date parse(String date) throws ParseException

{

return DATE_FORMAT.parse(date);

}

}

异常:

java.lang.NumberFormatException: For input string: ""

SimpleDateFormat这个类的源码。果然,在这个类的注释里,有这么一段话。

 * Date formats are not synchronized.
 * It is recommended to create separate format instances for each thread.
 * If multiple threads access a format concurrently, it must be synchronized
 * externally.

如何对待和定义静态对象?

static的目的是class共有的,并在内存中只定义一份,降低对内存的消耗,但在高并发下,要注意这种共享资源的安全问题。

观点:

static破坏了封闭,所有的类共享一个实例,在高并发第一个出问题必定是static,去掉static 可能一点事都没有
无论在java,还是在c++,还是objective-c,尽量少用static,特别在有多线程的场合
static表面上省内存,实质上更占内存,因为static内存很多时候不会被及时释放,static可能会导致性能降低,因为多个类都在等static的资源,static可能会导致并发问题。
oop的原则是能用new object就用new object,尽量不要在oop的墙上打洞。

观点二:

static是定时炸弹,不知道什么时候发作。不去使用它就不会发作。有了new根本没必要使用static,static反而会使内存出现问题,而new的问题比较容易解决。
static是c语言时代的产生,是为了方便共享资源,大凡“共享”的东西都容易出问题,因为“共享”的东西会出出现资源竞争的情况,在一定条件下就会发作。
现代cpu算力过剩,但内存不能崩,所以根本不需要使用static。

static是兼容所谓c++设计的,用于学习测试等单线程环境使用,是历史问题,在生产中中尽量不要使用static,使用new object才能充分发挥oop在jvm上的安全和自动管理性能。

 

高并发下的static类成员可能存在安全隐患

标签:多个   col   for   sim   java   oop   竞争   recommend   实例   

原文地址:http://www.cnblogs.com/hill-tell/p/7634773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!