java - 实习非线程安全字符串变体和静态初始值设定项

标签 java static thread-safety singleton

我正在写一个翻译器,并且有相当多的 java String 文字供翻译器使用。我有我自己的非阻塞线程安全分词器,它比 java.util.regex.Matcher 对于困难任务更快,并且与 Matcher 类不同,它是不可变的,因此我的分词器/Matcher 可以像不可变的最终类一样在多个线程之间共享正在做翻译。

匹配器类需要一个类似 CharSequence 的专用字符串类,但要针对我的分词器进行调整。我的 sequence/stringvariant 的一个子类是不可变的,它是从 java.lang.String 构造的,因此我的一个由多个线程共享的翻译器单例具有一个将 String 映射到 MyString 的内部 HashMap 。我想实习我的不可变分词器中使用的不可变字符串变体,因为许多文字都是相同的。

所以我有一个实习 hashmap 但不幸的是它被其他几个类的静态初始化程序添加到,因此这听起来像一个不是线程安全的映射。我如何在不阻塞 gets from it 的情况下逐步构建这个实习 map ?我也不想使用非阻塞并发 HashMap 。目标,只是一个普通的 HashMap。

安迪

最佳答案

it is being added to by the static initializers of several other classes,

这是一个问题,至少在 Java 6 中是这样。根据 "Initialization Problems for Java"

Concurrent initialization in Java may deadlock. If two threads initialize two dierent classes concurrently and both threads detect a rst active use of a component of the other class, then both threads become blocked, because they both wait that the respective other thread nishes its initialization.

所以类初始化锁是针对每个类的,可以可靠地防止过度初始化,但是可以同时初始化两个不同的类。

我会使用 ConcurrentMap如果您在其中放入很多值,或者如果它可能有很多读者但很少有作者,则可能在互斥量内复制写入并替换,因为分配给字段是原子的。

关于java - 实习非线程安全字符串变体和静态初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9067029/

相关文章:

javascript - 将现有 Express Node 应用程序发布到静态站点的最简单方法?

Java静态实例创建者?

c# - 在以下情况下,我应该使用线程安全集合吗?

java - Spring 中的 EJB 3.0 session Bean 相当于什么?

java - Spring ehcache no such method错误

c - C 中的 static const char* VS const char*

c# - CheckForIllegalCrossThreadCalls=false 的后果

java - Android ObjectAnimator 在选项后填充?

java - libgdx box2d,以一定角度创建时纹理/主体不在正确位置

c++ - 静态初始化不安全调用的线程安全