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

Hill_Dong Hill_Dong     2022-09-22     234

关键词:

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

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上的安全和自动管理性能。

 

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

缓存穿透介绍:当查询一个不存在的数据,此时缓存是不命中的,就会去查询db,这将导致每次查询这个不存在的数据都要去访问db,缓存就没有意义了。如果不怀好意的人利用不存在的数据进行攻击,可能导致数据库崩溃解决... 查看详情

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

...之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧... 查看详情

高并发下的java数据结构(list,set,map,queue)

由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的。本节将着重介绍一些可以用于多线程环境的数据结构,如并发List、并发Set、... 查看详情

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

...置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。如果这个key在大量请求同时进来前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿。解决:加锁。大量... 查看详情

java里,如何保证高并发下的数据安全

参考技术Ajdk环境变量配置进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:1、下载jdk(http://www.oracle.com/technetwork/java/javase/downloads/index.html),我下载的版本是:jdk-7u13-windows-i586.exe2、安装jdk-7u13-windows-i586.exe3、... 查看详情

一些react项目中可能存在的安全隐患(代码片段)

一些React项目中可能存在的安全隐患公司要求完成一系列的安全课程(Security),其中正好有React相关的,就上完了这个课,并且发现了以前一些漏掉的问题,在此总结一下。XSS攻击在[React基础系列]什么是JS... 查看详情

一些react项目中可能存在的安全隐患(代码片段)

一些React项目中可能存在的安全隐患公司要求完成一系列的安全课程(Security),其中正好有React相关的,就上完了这个课,并且发现了以前一些漏掉的问题,在此总结一下。XSS攻击在[React基础系列]什么是JS... 查看详情

面向对象高级

static关键字static关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量  被static修饰的成员变量,一般叫做静态变量  被static修饰的成员方法,一般叫做静态方法static修饰的特点  1.被类的所有对象共... 查看详情

漫画:高并发下的hashmap(代码片段)

这一期我们来讲解高并发环境下,HashMap可能出现的致命问题。               HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突... 查看详情

static实现单例的隐患

...的简单版本、无法在指令重排序下正常工作的Double-Check、static、内部类+static、枚举……。这篇文章要讨论的,是在使用static实现饿汉模式的单例时,会有隐患存在。2.Static单例的隐患2.1传统写法static实现单例的代码如下:publiccla... 查看详情

高并发下,hashmap会产生哪些问题?(代码片段)

HashMap在高并发环境下会产生的问题HashMap其实并不是线程安全的,在高并发的情况下,会产生并发引起的问题:比如:HashMap死循环,造成CPU100%负载触发fail-fast下面逐个分析下出现上述情况的原因:HashMap死循环的原因HashMap进行存... 查看详情

不同类型跨链桥中可能存在的安全隐患

到目前为止,区块链市场中已经出现了100多条不同的公链,一个多链的生态已经逐渐形成。在多链生态下,一个促进不同链之间的信息交流的机制——跨链桥就成为了区块链市场中的新宠,但随之而来的,却... 查看详情

浅谈4g时代智能手机存在哪些隐患

...的用户隐私信息,以及全新的木马病毒攻击方式都将成为可能!安全防御指出,在4G时代,超级手机木马很有可能大规模涌现,智能手机作为随身设备,甚至可以通过手机,实现远程视频、声音、图片、地理位置等全方位监控受害... 查看详情

高并发下的内存管理技巧

  1、为何高并发下容易oom    1)首先我们了解当执行垃圾回收的时候,会导致进程暂停,从而使我们的程序卡死;进程长时间暂停,又会导致大量的请求积压等待处理,垃圾回收刚刚结束,更多的请求立刻涌进来,迅速... 查看详情

对static静态成员的理解

...静态变量两种.  静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成... 查看详情

static关键字

 Static静态他是一个修饰符,用来修饰成员(成员变量or成员方法)修饰成员变量时,他修饰的是对象所拥有的一模一样的属性,这样就不必每次创建对象对象里都有一个共有的一模一样的本该被static修饰的属性。例如:中国... 查看详情

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量、方法是属于类本身还是属于类实例化后的对象。有static修饰的成员属于类本身,没有static修饰的成员属于类的实例。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失sta... 查看详情

static关键字

...个修饰符,用于修饰成员(成员变量,成员方法)1、被static修饰后的成员变量只有一份2、当成员被static修饰之后,多了一种访问方式,除了可以被对象调用之外还可以被类名直接调用(类名.静态成员)二、static的特点:1、随... 查看详情