public class SyschronizedSample{
private int value;
public synchronized int get(){ return value;}
public synchronized void set(int value)
{
this.value=value;
}
}
以上的代碼中,要使得訪問value時具有線程安全,所以在set和get方法中都加了synchronized同步語句,如果只在set方法前加syschronized,而不在get方法前面加,能否保證線程的安全性,為什麼
通常鎖都加在寫入操作上,保證同一時刻只能有一個線程修改共享數據,而讀操作不加鎖可能數據有較弱的一致性,即我們讀到數據後可能下一時刻有線程修改了該數據,但絕對是讀的那一時刻的最新數據,這是Java內存模型能夠保證的。從提高並發吞吐量上來講,沒有必要讀操作也用互斥鎖的,這也是我們優化並發程序的一個考慮方面,就是盡可能縮小鎖鎖粒度,加鎖范圍。如果讀操作對數據一致性要求不那麼苛刻的話,犧牲讀操作,換取高發效率也是值得的,Java典型的實踐就是ConcurrentHashMap,它能提供高效的寫效率,但對一些讀操作如size()操作一致性減弱,從另一個層面上來說,高並發環境下這種讀操作也沒有多大意義的,側重功能都集中在寫上面了。