相关疑难解决方法(0)

847
推荐指数
16
解决办法
31万
查看次数

ThreadLocal的目的?

这里给出的ThreadLocal的目的表明该变量是访问包含ThreadLocal变量的对象的任何Thread的本地变量.将ThreadLocal变量作为类的成员然后将其作为Thread的本地变量而不是将本地变量赋予Thread本身,它会有什么不同?

java multithreading thread-local

33
推荐指数
4
解决办法
2万
查看次数

可以使用ThreadLocal存储请求的Locale吗?

我正在努力将用户输入的数据国际化到一个相当大的客户端/服务器(HTTP(Hessian)用于通信)应用程序中,该应用程序存储在数据库中.用户可以选择他们想要查看的语言,并且在没有所请求语言的翻译时使用默认语言.

目前,数据类可能如下所示:

class MyDataClass {
  private Long id;
  private String someText;
  /* getters and setters */
}
Run Code Online (Sandbox Code Playgroud)

国际化后,它可能如下所示:

class MyDataClass {
  private Long id;
  private Set<LocalizedStrings> localizedStrings;
  /* getters and setters */
}
class LocalizedStrings {
  private Locale locale;
  private String someText;
  /* getters and setters */
}
Run Code Online (Sandbox Code Playgroud)

当然,在MyDataClass中创建一个委托getter可能会很有趣,它负责以正确的语言环境获取文本:

public String getSomeText(Locale locale) {
  for(LocalizedString localized : localizedStrings) {
    if (localized.getLocale().equals(locale)) {
      return localized.getSomeText();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的团队中,虽然需要一直传递语言环境直到它们到达数据类,但仍然存在一些问题.由于所有这些事情都发生在服务器上,并且每个对服务器的请求都是在专用线程中处理的,因此有人建议将请求的区域设置存储在ThreadLocal对象中并创建向后兼容的无参数getter:

public String getSomeText() {
  return getSomeText(myThreadLocalLocale.get());
}
Run Code Online (Sandbox Code Playgroud)

然后ThreadLocal需要是一个全局变量(静态的某个地方),或者需要在每个单独的实例创建时注入MyDataClass(我们使用spring,所以如果我们对数据类进行Spring管理,我们可以注入它(感觉错误)我)).

对于我来说,使用ThreadLocal对于语言环境感觉不对.我可以模糊地说,我不喜欢getter中的隐形魔法和全局变量的依赖(在数据类中!).然而,对此有一种"不好的感觉"并不是与同事争论它的好方法.为了帮助我需要以下其中一个答案:

  1. 告诉我,我的感觉很糟糕,解决方案非常适合X,Y和Z的原因.
  2. 给我一些很好的引用论据,我可以用它来与同事争论并告诉我如何更好地做到这一点(只是总是传递语言环境或任何其他想法?)

java thread-local

9
推荐指数
1
解决办法
1773
查看次数

ThreadLocal的使用如何降低可重用性

备受好评的书籍JCIP对ThreadLocal的使用说明了这一点:

通过将其线程限制属性视为使用全局变量的许可或作为创建"隐藏"方法参数的方法,很容易滥用ThreadLocal.线程局部变量可能会降低可重用性并在类之间引入隐藏的耦合,因此应谨慎使用.

说Thread-local变量可以减少可重用性并在类之间引入隐藏的耦合是什么意思?

java concurrency multithreading synchronization thread-local

7
推荐指数
1
解决办法
919
查看次数