gpt4 book ai didi

java - String.intern() 线程安全有保证吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:29 25 4
gpt4 key购买 nike

是否有任何文件证明 String.intern() 是线程安全的? javadoc 提到了它但没有直接解决它:

Returns a canonical representation for the string object. A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.

值得注意的是,javadoc 说保证会返回池中的字符串,但并不是说池本身是线程安全的(因此按照书面形式,它似乎为在事件中替换池条目敞开了大门竞争线程,尽管我认为这种解释不太可能)。

并且 String 的 JDK 源代码显示 intern() 是一个本地方法,没有阐明其线程安全性:

public native String intern();

我特别关心的是以下内容是否是完全线程安全的,保证为每个唯一字符串只创建(不仅仅是存储在缓存中)MyObject面对并发请求的值(value):

public void myMethod(String myString)
{
// Get object from cache, the cache itself is thread safe
MyObject object = myCache.get(myString);
if (object == null)
{
synchronized(myString.intern())
{
// Retry cache to avoid race condition
object = myCache.get(myString);
if (object == null)
{
object = new MyObject(myString);
// ... do some startup / config of the object ...
myCache.put(object);
}
}
}
// do something useful with the object
}

我希望避免在方法或缓存本身上进行同步,因为对象的创建可能需要一些时间(需要网络访问)。有一些解决方法,例如维护本地线程安全缓存/字符串池,但除非必要,否则不值得这样做。 String.intern() 的内存影响(无法从缓存中删除驻留字符串)与此特定用例(使用的字符串数量较少)无关。

我相信 String.intern() 是线程安全的并且上面的代码很好,但是缺乏来自可靠来源的直接确认让我有点担心。

这个问题以前在这里被问过很多次,但是没有提供具体的答案和引用:

最佳答案

这实际上听起来您可能想要 Guava Striped<Lock> ,它以散列方式将对象映射到锁。同步驻留字符串似乎是一个潜在的危险黑客,可能有 weird side effects如果您使用的任何其他代码有相同的想法。

关于java - String.intern() 线程安全有保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21890141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com