線程安全問題實(shí)際上來源于兩個線程同時存取單一對象的數(shù)據(jù)笑陈。
線程同步機(jī)制
同步塊
給共享資源上鎖,關(guān)鍵字:synchronized,設(shè)置在共享資源中
synchronized(Object){
}
通常將共享資源操作放在這個代碼塊內(nèi)沉颂。當(dāng)其他線程也獲取到這個鎖的時候,必須等待鎖被釋放時才能進(jìn)入該區(qū)域悦污,Object可以是一個類铸屉,此時相當(dāng)于修飾了一個類,不填可以指定為空字符串 " "切端。
同步非靜態(tài)方法(同步對象的方法)
Synchronized修飾一個方法很簡單彻坛,就是在方法的前面加synchronized,public synchronized void method(){//todo}; synchronized修飾方法和修飾一個代碼塊類似帆赢,只是作用范圍不一樣小压,修飾代碼塊是大括號括起來的范圍,而修飾方法范圍是整個函數(shù)椰于。
同步靜態(tài)方法(同步類的所有對象的方法)
Synchronized也可修飾一個靜態(tài)方法,用法如下:
public synchronized static void method() {
// todo }
我們知道靜態(tài)方法是屬于類的而不屬于對象的仪搔。同樣的瘾婿,synchronized修飾的靜態(tài)方法鎖定的是這個類的所有對象。
繼承問題
synchronized關(guān)鍵字不能繼承烤咧。
雖然可以使用synchronized來定義方法偏陪,但synchronized并不屬于方法定義的一部分,因此煮嫌,synchronized關(guān)鍵字不能被繼承笛谦。如果在父類中的某個方法使用了synchronized關(guān)鍵字,而在子類中覆蓋了這個方法昌阿,在子類中的這個方法默認(rèn)情況下并不是同步的饥脑,而必須顯式地在子類的這個方法中加上synchronized關(guān)鍵字才可以恳邀。