執行緒主要通過對某塊欄位和引用欄位所引用的物件們的共享存取來實現通訊。
這種形式的通訊非常有效但可能出現兩種錯誤:執行緒衝突和記憶體一致性錯誤。防止這些錯誤的工具是同步。 然而,同步可能引入執行緒競爭,當兩個或多個執行緒試圖同時訪問相同的資源,並導致了Java執行時更慢的執行一個或多個執行緒,或者甚至暫停其執行時,執行緒競爭就發生了。飢餓和活鎖是執行緒競爭的形式。
當連個不同執行緒中的兩個操作對同一個資料交叉存取時,衝突就會發生。
記憶體一致性錯誤
當不同執行緒對相同資料的視角不同時,就會發生記憶體一致性錯誤。 避免記憶體一致性錯誤的關鍵是理解前發生(happens-before)這種關係原則,前發生關係原則僅僅是某個具體語句對記憶體寫時必須保證對其它一些特定語句可見。
有幾種可以用來建立前發生關係的方法。其中之一是同步。
同步是通過使用內部鎖(intrinsic lock)或監視鎖(monitor lock)的內部實體而實現的
每個物件都擁有與他相關的內部鎖。