有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    一个典型的例子是SimpleDateFormat,它不是线程安全的。在多线程环境中,除其他外,有两个线程安全选项:

    private static ThreadLocal<SimpleDateFormat> fmtHolder = new ThreadLocal<SimpleDateFormat>() {
      @Override protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("dd/MM/yyyy");
      }
    };
    
    private void method() {
      SimpleDateFormat fmt = fmtHolder.get();
    }
    

    或使用本地实例:

    private void method() {
      SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
    }
    

    前者效率更高,而后者更易于阅读和推理

  2. # 2 楼答案

    局部变量只能在声明它的函数或块中使用,当函数返回或块退出时,它就不再存在

    当需要静态数据,但希望每个线程都有自己的副本时,可以使用ThreadLocal对象,通常从static变量或单例对象的实例变量引用

  3. # 3 楼答案

    线程局部变量在不同的线程中有不同的实例。这允许每个线程拥有自己的变量视图,该视图独立于其他线程看到的内容。“Plain”局部变量是单个实例,当以线程安全的方式访问时,所有线程中的值都相同