高并发下的static类成员可能存在安全隐患
Posted Hill_Dong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发下的static类成员可能存在安全隐患相关的知识,希望对你有一定的参考价值。
有一个网友在高并发下使用下面的日期转换工具类时,遇到的问题
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类成员可能存在安全隐患的主要内容,如果未能解决你的问题,请参考以下文章