根據程式上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類別、非抽象類別成員方法和變數。
(1)final類不能被繼承,沒有子類,final類中的方法預設是final的。
(2)final方法不能被子類的方法覆蓋,但可以被繼承。
(3)final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
(4)final不能用於修飾構造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的(當然不能被繼承),因此private類型的方法預設是final類型的。
===========================================================================================================
(1)synchronized關鍵字的範圍有二種:
A,某個對象執行個體內,synchronized aMethod(){}可以防止多個線程同時訪問這個對象的synchronized方法,相當於每一次運行到這個法,都要檢查有沒有其它正在用這個方法的程式,有的話要等其它運行完這個方法後再運行此線程;沒有的話,直接運行(如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法)。但是,不同的對象執行個體的synchronized方法是不相干擾的,也就是說其它線程照樣可以同時訪問相同類的另一個對象執行個體中的synchronized方法。
B,某個類的範圍,synchronized static aStaticMethod{}防止多個線程同時訪問這個類中的synchronized static 方法。它可以對類的所有對象執行個體起作用。綜合以上兩點可以得出結論,synchronized修飾在靜態方法上表示調用前要獲得類的鎖,而在非靜態方法上表示調用此方法前要獲得對象的鎖。
(2)除了方法前用synchronized關鍵字,synchronized關鍵字還可以用於方法中的某個區塊中,表示只對這個區塊的資源實行互斥訪問。用法是:private final Object mLock = new Object(); ........... synchronized(syncObject){/*區塊*/},它的範圍是當前對象,syncObject可以是類執行個體或類(如果程式碼片段所在函數是static的,則syncObject本身也要有static修飾,否則提示:non-static variable
syncObject cannot be referenced from a static context)。
(3)關於死結。多個程式碼片段加鎖的目的就是為了這幾個程式碼片段之間互斥執行,如果一個synchronized(syncObject)程式碼片段中的函數調用了另一個函數B,而函數B中也有synchronized(syncObject)程式碼片段,這就造成了死結。因為兩者約束了同一個syncObject。
參考原文:http://c.360webcache.com/c?m=79cc646527b44025e5b6582c5e97431c&q=synchronized&u=http%3A%2F%2Fzhidao.baidu.com%2Fquestion%2F212393605.html#360sou
參考原文:http://www.blogjava.net/hongzionline/archive/2007/09/19/146392.html
參考原文:http://zhidao.baidu.com/question/68492173.html
參考原文:http://zhidao.baidu.com/question/106703762.html