synchronized

首先是synchronized關鍵字的作用域可以有兩種:
・某個對象實例內
synchronized aMethod(){}可以防止多個線程同時訪問這個對象的synchronized方法(如果一個對象有多個synchronized方法,只要一個線 程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法)
・某個類的範圍
synchronized static aStaticMethod{}防止多個線程同時訪問這個類中的synchronized static 方法
●synchronized關鍵字是不能繼承的
●要注意的事項
・無論synchronized關鍵字加在方法上還是對象上,它取得的鎖都是對象,而不是把一段代碼或函數當作鎖――而且同步方法很可能還會被其他線程的對象訪問
每個對象只有一個鎖(lock)與之相關聯
實現同步是要很大的系統開銷作爲代價的,甚至可能造成死鎖,所以儘量避免無謂的同步控制
對共享資源的同步訪問更加安全的技巧
定義private instance變量+它的 get方法,而不要定義public/protectedinstance變量。如果將變量定義爲public,對象在外界可以繞過同步方法的控制而直接取得它,並改動它。
如果instance變量是一個對象,如數組或ArrayList什麼的,那上述方法仍然不安全,因爲當外界對象通過get方法拿到這個instance對象的引用後,又將其指向另一個對象,那麼這個private變量也就變了,豈不是很危險。 這個時候就需要將get方法也加上synchronized同步,並且,只返回這個private對象的clone()――這樣,調用端得到的就是對象副本的引用了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章