2012-01-30 34 views
2

我正在编写一个翻译器,并且有很多翻译器使用的java字符串。我有我自己的非阻塞线程安全标记器,它比java.util.regex.Matcher的硬任务更快,而且与Matcher类不同,它是不可变的,因此我的标记器/匹配器可以像多个线程中的不可变最终类一样共享正在翻译。内部非线程安全字符串变体和静态初始化程序

匹配器类需要一个类似于CharSequence的专门化的类字符串类,但调整为我的标记器。我的序列/字符串变体的一个子类,它是由java.lang.String构造的,是不可变的,因此我的一个由多个线程共享的翻译器单体具有一个将String映射到MyString的内部哈希映射。我想实习我的不可变字符串变体,这些变体在我的不可变标记化程序中使用,因为许多文字是相同的。

因此,我有一个interning hashmap,但不幸的是它正在被其他几个类的静态初始化程序添加,因此听起来像一个不是线程安全的地图。我怎样才能增量构建这个实习地图,而不是从它阻止它?我也不想使用非阻塞并发hashmap。目标,只是一个普通的HashMap。

安迪

+1

_why_你想要一个非线程安全的字符串吗?如果这是因为您需要能够改变字符串,请查看“StringBuilder”。否则,只需使用'String'。另外,除非调用'intern()'方法,否则Java中的字符串只会在编译过程中(通常)被执行 - 这不建议大量字符串使用。编写'this.map = this.map'很可能会被编译器优化 - 并且不会做你想要的东西(对_map_的引用将是易失性的,而不是**它所包含的信息。一个'SynchonizedMap',并在完成时将它封装为'UnmodifiableMap' – 2012-01-30 16:57:36

+0

编写你自己的字符串类不仅仅是一种代码味道,它是一种代码恶臭 – 2012-01-30 18:45:30

+0

你在问一个非常具体的问题,我希望你编辑你的你想要做什么?你想做什么?你的“非线程安全字符串变体”的目的是什么? – Gray 2012-01-30 19:23:09

回答

0

它正被其它几个类的静态初始化加入,

这是一个问题,至少在爪哇6.据"Initialization Problems for Java"

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

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

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

相关问题