2012-01-30 38 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

相關問題