英文:
ThreadLocal initialValue() vs set()
问题
我理解 ThreadLocal
类的目的;但对于 initialValue()
和 set()
方法感到有些困惑。
对我来说,两者似乎具有相同的目的 - 将值设置到 ThreadLocal
对象,以便每个线程都可以获得自己的副本。
无论是使用 initialValue()
还是 set()
来设置值,您始终可以通过调用 get()
方法来获取值。
您可以通过调用 remove()
方法来删除值。
- 我们什么时候需要使用
initialValue()
方法? - 我们什么时候需要使用
set()
方法?
英文:
I understand the purpose of ThreadLocal
class; but bit baffled by the methods initialValue()
and set()
.
To me, both seems to be having the same purpose - to set the value to the ThreadLocal
object so that each thread will get its own copy.
Regardless of whether initialValue()
or set()
is used to set the value, you always get the value by calling the get()
method.
You can remove the value by calling the remove()
method.
- When do we need to use the
initialValue()
method? - When do we need to use the
set()
method?
答案1
得分: 2
首先,initValue()
是一个 protected
方法,这意味着你不能在 ThreadLocal
类外部或其子类中使用它。它只有一个目的,正如它的名字所示,提供初始值,仅在初始化时被调用一次。
如果你查看这个类,你会发现在内部,initValue()
总是返回 null
,除非你使用 ThreadLocal.withInitial(Supplier supplier)
提供了一个 Supplier
,或者在你自己扩展的 ThreadLocal
中重写了这个方法。
详细信息请阅读文档。文档总是有帮助的:
https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html
希望能对你有所帮助!编码愉快。
英文:
First of all, initValue()
is a protected
method, which means you can not use it outside the ThreadLocal
class or it's children. It serves one purpose only, which it's name suggests, to provide initial value and is invoked only once.
If you look at the class, you'll find that internally, initValue()
always returns null
unless you provide a Supplier
with ThreadLocal.withInitial(Supplier supplier)
or override this method in your own extension of ThreadLocal
.
Do read the docs for details. They always help-
https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html
Hope this helps! Happy coding.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论