2014-09-28 39 views
1

我有一些類似於地圖的存儲。我一直使用synchronized(this)getput方法。由於此存儲大多用於讀取,因此我想使用ReentrantReadWriteLock以獲得更好的性能 - 僅鎖定putReentrantReadWriteLock讀鎖的性能?

我預計查找性能會更好(因爲存儲內容沒有改變)。然而,我的JMH測試示出了相反:

.benchmarkClassMap3ClassLookup thrpt  20 460.152  7.417 ops/ms 
.benchmarkClassMapClassLookup  thrpt  20 1196.085  23.635 ops/ms 

第一行是使用ReentrantReadWriteLock的代碼。第二行代碼爲​​。編輯:測試運行2線程。

是否有其他人以基準測試ReentrantReadWriteLock?不應該是不同的結果?或者只有在多線程環境中才能看到積極的結果?

相關:this

+0

你用什麼jdk? – dcernahoschi 2014-09-28 17:48:22

+0

java版本「1.7.0_67」 – igr 2014-09-28 17:50:09

+0

雖然你的數據只是像一張地圖,你是否有ConcurrentHashMap?至少爲了比較。 – 2014-09-28 18:16:04

回答

3

因爲ReentrantReadWriteLock比簡單的​​更復雜,所以您需要確保多個線程才能看到好處。在​​的情況下,如果JVM看到只有一個線程,它們可能會優化並刪除所有同步。但這裏也從的ReentrantReadWriteLock的javadoc報價:

ReentrantReadWriteLocks可以用來改善某些類型的集合的一些 用途併發。當集合預計會很大時,這通常是值得的,因爲更多讀取器可以訪問比寫入器線程更多的線程,並且需要開銷的操作,其中 超過同步開銷。

如果您願意轉移到Java 8,您可以用此版本隨附的新StampedLock替換ReentrantReadWriteLock。有關簡短示例和優點,請參見this answer

+0

Thanx。我犯了一個錯誤,我的測試使用2個活動線程運行。順便說一句,這是一個[有趣的文章](http://www.javacodegeeks.com/2014/06/java-8-stampedlocks-vs-readwritelocks-and-synchronized.html) – igr 2014-09-28 20:05:12

相關問題