如何知道 Java SE 类或方法是否线程安全?

2024-01-18

例如:

static private DateFormat df = new SimpleDateFormat();
public static void format(final Date date) { 
   for (int i = 0; i < 10; i++) 
     new Thread(new Runnable() {
         public void run() {
             System.out.println(df.format(date));
         } 
     });
}

The DateFormat类被记录为不是同步类,但是如果我们只使用 format 方法,它不能改变整个类的状态?

假设它被声明为私有,如何确定代码是线程安全的?

修复此代码的最佳方法是什么?:

  1. 为每个线程使用不同的实例。

  2. 使用同步块。


  • 对于标准的 Java SE 类,了解该类是否线程安全的最佳方法是仔细阅读其文档。请务必阅读类文档和方法文档。如果说它不是同步的或不是线程安全的,那么您就知道它不是线程安全的。
  • 因此,DateFormat类是not线程安全。文档具体说:

    日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问某种格式,则必须进行外部同步。

  • 声明一个字段private does not使您的实现线程安全。private只是说外部类看不到该字段。让我们看看你的方法:

     for (int i=0;i<10;i++) 
         new Thread(new Runnable(){
             public void run(){
                 System.out.println(df.format(date));
             } 
         });
    

    The Runnable您创建的对象是匿名类。匿名类是inner类,可以访问其周围类的私有字段。如果不是这样,你的程序将无法编译 - 他们无法访问df field.

    但他们可以。所以事实上你有 10 个线程都在访问你的线程DateFormat对象,由df。既然我们已经知道DateFormat is not线程安全,你的程序不是线程安全的。

  • 此外,如果两个外部线程引用了您的对象(我的意思是具有df在里面。您没有给出类声明,所以我不知道它的名字是什么)。它们引用了您的类的同一实例。如果他们两个都打电话format同时,两者都将运行DateFormat.format使用相同的私有df。因此,这不会是线程安全的。
  • 为了实现线程安全,您需要在对象上进行同步或使用某种其他类型的锁(对所有可能访问该对象的线程使用一个锁),这正是文档所说的要做的事情。
  • 另一种方法是拥有一个完全本地的对象,该对象仅对一个线程可见。不是字段 - 局部变量,可以访问唯一创建的实例DateFormat(因此每次调用该方法时都会有一个新副本)。但要小心匿名类!在你的例子中,即使df是当地的一个领域format方法,它仍然不是线程安全的,因为所有线程都将访问相同的副本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何知道 Java SE 类或方法是否线程安全? 的相关文章

随机推荐

  • php - 检测字符串中的 HTML 并用代码标签包装

    我在处理文本内容中的 HTML 时遇到了麻烦 我正在考虑一种方法来检测这些标签并将所有连续的标签包装在代码标签内 别包裹我 p Hello p div class text wrap me please div span class tit
  • 指针声明为常量和易失性

    在阅读时 我遇到了这种类型的声明和以下行 const volatile char p const volatile char 0x30 p 的值仅受外部条件的影响 我不明白外部条件是什么 还有这种类型的实际用途是什么宣言 The const
  • 支持泛型的 Java 动态代码生成

    有没有提供Java动态代码生成并且还支持泛型的工具 例如 Javassist 就是我需要的工具 但它不支持泛型 我编写了一个使用 Java 6 编译器 API 的小库 但据我所知它依赖于 JDK 有没有办法指定另一个编译器 或者只随我的应用
  • 软件评估 - 许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以帮助我解决软件许可模块问题吗 我们创建了一个新应用程序 并希望发布我们工具的演示版本 30 天试用版 稍后我们需要完整版本 如
  • UITableViewCell 中的 AVPlayer.play() 会短暂阻塞 UI

    我正在尝试将内嵌视频添加到我的 UITableViewCells 如 Instagram Twitter Vine 等 我正在使用 AVPlayerController 和自定义单元通过本地视频文件测试 UI 请参阅下面的示例代码 我等待
  • 无法连接到atom.io 获取主题和包

    我相信我的工作代理阻止我向 Atom 添加主题和包 从首选项菜单中 我得到 获取特色包和主题失败 隐藏输出 tunneling socket could not be established cause 140499728967552 er
  • Scipy.Odr 多变量回归

    我想执行多维 ODRscipy odr 我读了 API 文档 它说多维是可能的 但我无法让它工作 我在互联网上找不到工作示例 而且 API 非常粗糙 没有给出如何继续的提示 这是我的 MWE import numpy as np impor
  • R 中的掩码方法

    这个问题 https stackoverflow com questions 30600958 using gather from tidyr changes my regression results 30638813特别是这个答案 ht
  • 谷歌地图矩形可编辑:如何锁定(固定)高度进行编辑

    我有一个谷歌地图 里面有一个可编辑 可移动和调整大小等的矩形 我正在寻找的是一种锁定矩形给定高度的方法 所以只有 宽度可以改变 您可以使用 JavaScript 中的bounds changed 事件来阻止矩形调整高度大小 这是一个工作的
  • COMPILE_FLAGS 和 COMPILE_OPTIONS 之间的区别

    有什么区别 COMPILE FLAGS 编译此目标源时使用的附加标志 and COMPILE OPTIONS 传递给编译器的选项列表 就最终的 VS2010 解决方案而言 这些命令产生相同的结果 target compile options
  • 如何链接独立的 C# 任务?

    假设我有两个独立的异步函数 我不控制 来创建任务对象 Task A Task B 以及其他一些非异步函数 void X 如何构建一个按顺序执行所有这些任务并允许附加进一步的延续 将在 X 之后执行 的单个任务链 如果我这样做 Task Se
  • 如何将Sinon 与Typescript 结合使用?

    如果我将 sinon 与 typescript 一起使用 那么如何将 sinon 模拟转换为我的对象的实例 例如 将返回一个SinonMock 但我的被测控制器可能需要将特定服务传递给其构造函数 var myServiceMock MySt
  • 如何正确配置 module.alias

    我想用resolve alias我的项目中使用 webpack 的功能反应入门套件 https github com kriasoft react starter kit 例如 相反 这个 import Component from com
  • 创建连续的动态矩阵

    数组具有作为连续内存块的良好特性 使用时new为数组分配内存 它返回一个指向连续的内存块 但是 如果我使用分配矩阵new 像这样 include
  • 如何显示修订历史记录

    Stack Overflow 如何以它们使用的类似 diff 的格式显示修订更改 我不关心 Stack Overflow 本身 这只是描述我的要求的一种便捷方式 我有文本字段更改的审核历史记录 我想以 Stack Overflow 显示修订
  • UIPickerView 编程示例?

    如何在不使用 Interface Builder 的情况下以编程方式在视图中设置 UIPickerView 还难以理解如何使用 UIPickerView 的委托部分 以编程方式添加 UIPickerView void pickerView
  • 如何说服 Visual Studio 使用 ADB 通过 TCP/IP 进行 Android 开发

    所以这可能有点边缘情况 但我在虚拟机上使用 Visual Studio 而且我手里拿着手机 我想进行设置 当我在 Visual Studio 中按 播放 时 它会编译我的 Cordova 应用程序 并将其推送到我旁边的手机上 以便我可以测试
  • 以独立于区域设置的方式访问 Windows 性能计数器

    我有一组混合服务器 一些运行英语 Windows 另一些运行意大利语 Windows 有没有一种方法可以在不使用与区域设置相关的字符串的情况下读取性能计数器的值 我读到Zabbix 文档 http www zabbix com docume
  • 获取 tkinter 文本小部件中的位置

    我正在尝试找到一种可靠的方法来获取 tkinter 文本小部件中的当前光标位置 到目前为止我所拥有的是 import tkinter as tk def check pos event print t index tk INSERT roo
  • 如何知道 Java SE 类或方法是否线程安全?

    例如 static private DateFormat df new SimpleDateFormat public static void format final Date date for int i 0 i lt 10 i new