繁体   English   中英

内部非线程安全字符串变体和静态初始值设定项

[英]interning non thread safe string variants and static initializers

我正在编写一个翻译器,并且有许多翻译器使用的java String文字。 我有自己的非阻塞线程安全令牌生成器,它不可变,因此比java.util.regex.Matcher更快,并且与Matcher类不同,它是不可变的,因此可以像在多个线程中不可变的最终类一样共享我的令牌生成器/匹配器正在翻译。

matcher类需要一个特殊的字符串型类,类似于CharSequence,但已调到我的令牌生成器。 从java.lang.String构造的我的sequence / stringvariant的一个子类是不可变的,因此,我的一个由多个线程共享的转换器单例具有一个将String映射到MyString的内部哈希图。 我想在我的不可变标记器中使用我的不可变字符串变体,因为许多文字是相同的。

因此,我有一个内部散列图,但是不幸的是,它由其他几个类的静态初始化程序添加到其中,因此听起来像是不是线程安全的映射。 我如何逐步构建此内部地图而不会从中获取阻碍? 我也不想使用非阻塞并发哈希图。 目标,只是一个简单的HashMap。

安迪

它是由其他几个类的静态初始化程序添加的,

至少在Java 6中,这是一个问题。根据“ Java的初始化问题”

Java中的并发初始化可能会死锁。 如果两个线程同时初始化两个不同的类,并且两个线程都检测到对另一个类的组件的首次使用,则这两个线程都会被阻塞,因为它们都等待各自的另一个线程完成其初始化。

因此,类初始化锁是按类的,并且可以可靠地防止过度初始化,但是可以同时初始化两个不同的类。

如果要在其中放置很多值,或者如果它可能有很多读者但写作者很少,则我将使用ConcurrentMap ,因为互斥量中的写入是原子的,因此也许可以在互斥体中写时复制并替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM