"Calendars" and "DateFormats" should not be static

“Calendars” and “DateFormats” should not be static

级别:bug, multi-threading

Not all classes in the standard Java library were written to be thread-safe. Using them in a multi-threaded manner is highly likely to cause data problems or exceptions at runtime.
This rule raises an issue when an instance of Calendar, DateFormat, javax.xml.xpath.XPath, or javax.xml.validation.SchemaFactory is marked static.

Noncompliant Code Example

public class MyClass {
  static private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss");  // Noncompliant
  static private Calendar calendar = Calendar.getInstance();  // Noncompliant

Compliant Solution

public class MyClass {
  private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss");
  private Calendar calendar = Calendar.getInstance();

不要在多线程环境下将这两个类成员声明为staticCalendarsDateFormats并不是线程安全的类型,意味着在多线程环境下可能由于其他线程改变了这两个静态成员对象导致当前线程使用时无法得到理想的结果。

为什么不能是static类型呢?
线程安全问题发生的两个必要条件:1. 存在共享变量。2. 存在某个线程对共享变量存在写操作
static类型意味着该变量属于当前类,很容易在使用时改变当前类对象,从而引起潜在的线程安全问题。
其实,就算不声明成static也不意味着线程安全问题完全得到解决,当多个线程同时操作该类型的实例时,仍然可能导致线程安全问题,只是这种几率比较小(多个线程同时操作某个包含SimpleDateFormat类型的实例)。

如何解决这个问题?
从线程安全问题的必要条件入手。
可以把成员声明为final,使其不可被改写。
或不声明为static减少线程安全问题发生的几率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值