同步鎖可以使用字符串對象做鎖需要注意的事項

Java中使用String作同步鎖

在Java中String是一種特殊的類型存在,在jdk中String在創建後是共享常量池的,即使在jdk1.8之後實現有所不同,但是功能還是差不多的。

藉助這個特點我們可以使用String來作同步的鎖,比如更新用戶信息的時候,可以使用用戶的名稱作爲同步鎖,這樣不同的用戶就可以使用不同的鎖,提升併發性能。這個特點擴展開來適當的場景就非常之多了。

只不過正因爲String的特殊性,java還包含了更多的與字符串相關的工具類,如StringBuffer、StringBuilder等。而且字符串映射的值是常量,但是String本身是可以new出來類似一個變量使用的。這些情況就會影響線程的同步了。

 


1.不要使用new String()對象來做同步鎖

2.StringBuffer、StringBuilder這也是使用字符串作爲同步鎖需要注意的問題。比如某些場景下需要對字符串拼接後作爲鎖。比如:用戶名+機構名。會出問題的原因StringBuiler的toString方法中返回的是new String,代碼如下:

@Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

 解決方案:

使用String作爲同步鎖必須注意產生不同對象的問題,必須保證線程拿到的是同一個String對象。做法最簡單的就是使用同一個String對象,那我們可以使用String.intern()方法後,就是從返回的是該常量的引用。

String.intern(),我總結了下面幾條規則:
一、new String都是在堆上創建字符串對象。當調用 intern() 方法時,編譯器會將字符串添加到常量池中(stringTable維護),並返回指向該常量的引用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章