SimpleDateFormat的Javadoc指出SimpleDateFormat没有同步。
“日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部进行同步。”
但是,在多线程环境中使用SimpleDateFormat实例的最佳方法是什么。这是我想到的一些选项,我过去曾使用过选项1和2,但是我很想知道是否有更好的选择,或者这些选项中的哪一个可以提供最佳的性能和并发性。
选项1:在需要时创建本地实例
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
选项2:将SimpleDateFormat的实例创建为类变量,但同步对其的访问。
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
选项3:创建一个ThreadLocal来为每个线程存储一个不同的SimpleDateFormat实例。
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}
创建SimpleDateFormat非常昂贵。除非很少做,否则不要使用它。
好吧,如果您可以忍受一点阻碍。如果formatDate()的使用量很少,则使用此方法。
如果重用线程(线程池),则是最快的选择。比2使用更多的内存,并具有较高的启动开销。
对于应用程序2.和3.都是可行的选择。哪种情况最适合您的情况取决于您的用例。提防过早的优化。仅当您认为这是一个问题时才这样做。
对于将由第三方使用的库,我将使用选项3。
问题内容: 我正在使用Spring,Hibernate和JPA实体管理器。当同时(通过jquery / ajax)获取UI的不同区域时,我想同步对JPA实体管理器的访问,否则会导致对集合异常的共享引用。我该如何实现?我有一个控制器,它在后端调用服务方法,这些服务方法负责在entitymanager上调用get / save等。 问题答案: 您可以使用特定模式在对象上应用锁定。 实体经理: 查询:
我试图了解正确的方法来同步文件读/写在PHP中使用群。 我有两个php脚本。 testread.php: 和testwrite。php: 现在我跑testread.php,让它挂在那里。然后我在另一个会话中运行testwrite.php。正如预期的那样,flock在testwrite.php.失败但是,当testwrite.php退出时,文件test.txt的内容被清除。事实是,即使文件在另一个进
有人能给我解释一下这个错误是什么,如何解决这个错误吗? 分级同步失败:D:\SoundsandPictures.Gradle\4.4\FileHashes\FileHashes.Lock(访问被拒绝) 注意:我的项目是在D:驱动器上,我不小心删除了驱动器上的所有数据,并使用恢复软件恢复了它,在android Studio中打开项目时出现了这个错误。
问题内容: 我正在阅读同步工作。这是示例: 让假定有两个线程和正在访问的方法,如果线程是块则线程将跳过该块,执行下一个块/语句或将等待/阻塞,直到线程离开 块。 第二是什么,为什么在参数中以及什么时候可以 下面是真的吗? 内在锁在对象上: 如果线程A在其中,则无法输入或任何其他同步方法。 问题答案: 1:线程B将等待,直到线程A释放对同步对象的锁定之后,线程A将释放对同步对象的锁定并执行代码。 2
问题内容: 我创建了一个小型Java servlet,其目的很简单:调用它后,它将执行以下步骤: 从本地文件系统读取文件foo.json 处理文件中的数据并对其进行一些更改 将更改写回文件 代码的简化版: 现在,我面临一个问题,即可能有两个或多个对servlet的http请求几乎同时调用servlet。为了避免对同一文件进行多次并行写访问,我需要以某种方式进行同步。根据我对servlet生命周期过