下午:程序員
程序員須要關注的線程同步和互斥的問題。多線程
多線程的併發通常不是程序員決定,而是由容器決定。併發
多線程出現故障的緣由:線程
兩個線程同時訪問一個數據資源(臨界資源),造成數據發生不一致和不完整。對象
數據的不一致每每是由於一個線程中的兩個關聯的操做只完成了一步。繼承
避免以上的問題可採用對數據進行加鎖的方法事件
每一個對象除了屬性和方法,都有一個monitor(互斥鎖標記),用來將這個對象交給一個線程,只有拿到monitor的線程纔可以訪問這個對象。資源
Synchronized:這個修飾詞能夠用來修飾方法和代碼塊同步
Object obj;it
Obj.setValue(123);
Synchronized用來修飾方法,表示當某個線程調用這個方法以後,其餘的事件不能再調用這個方法。只有拿到obj標記的線程纔可以執行代碼塊。
注意:Synchronized必定使用在一個方法中。
鎖標記是對象的概念,加鎖是對對象加鎖,目的是在線程之間進行協調。
當用Synchronized修飾某個方法的時候,表示該方法都對當前對象加鎖。
給方法加Synchronized和用Synchronized修飾對象的效果是一致的。
一個線程能夠拿到多個鎖標記,一個對象最多隻能將monitor給一個線程。
Synchronized是以犧牲程序運行的效率爲代價的,所以應該儘可能控制互斥代碼塊的範圍。
方法的Synchronized特性自己不會被繼承,只能覆蓋。