高并发下的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类成员可能存在安全隐患的主要内容,如果未能解决你的问题,请参考以下文章

高并发下的HashMap

高并发下缓存失效问题及解决方案

高并发下缓存失效问题及解决方案

Netty高并发下数据丢失问题与性能优化配置

高并发下的Java数据结构(List,Set,Map,Queue)

高并发下线程安全的单例模式