應用:雙重校驗實現執行緒安全的單例模式
注意奧,這個同步非同步不要與多執行緒的概念混淆
-synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者**塊在任意時刻只能有乙個執行緒執行–>
synchronized關鍵字最主要的使用方式:
修飾**塊
具體一點:乙個執行緒訪問乙個物件中的synchronized(物件)同步**塊時,其他試圖訪問該物件的執行緒將被阻塞,這裡的o也被稱為鎖物件,任何執行緒要執行先要拿到鎖物件
classt}
}
修飾**塊還有乙個簡化寫法,可以不用每次都去新建物件作為鎖物件
classt}
}
我們知道,誰呼叫誰是this,那麼通過推導,這裡的this等效型別為t的物件
修飾例項方法
class
t}
同理,執行該**的執行緒,首先要獲得m方法的、型別為t的例項(鎖物件)
修飾靜態方法
class
tpublic
static
voidmm(
)}}
解釋:因為靜態成員不屬於任何乙個例項物件,是類成員( static 表明這是該類的乙個靜態資源,不管new了多少個物件,只有乙份),所以如果乙個執行緒 a 呼叫乙個例項物件的非靜態synchronized 方法,而執行緒 b 需要呼叫這個例項物件所屬類的靜態synchronized 方法,是允許的,不會發生互斥現象,因為訪問靜態 synchronized 方法占用的鎖是當前類的鎖,而訪問非靜態 synchronized 方法占用的鎖是當前例項物件鎖
什麼樣的**放入synchronized中?
1.**被多個執行緒訪問
2.**中有共享的資料
3.共享資料被多條語句操作
public
class
singleton
public
static singleton getuniqueinstance()
}}return uniqueinstance;
}}
uniqueinstance 採用 volatile 關鍵字修飾是很有必要的,uniqueinstance = new singleton();這段**其實是分為三步執行:
為 uniqueinstance 分配記憶體空間
初始化 uniqueinstance
將 uniqueinstance 指向分配的記憶體位址
但是由於 jvm 具有指令重排的特性,執行順序有可能變成1->3->2
。指令重排在單執行緒環境下不會出現問題,但是在多執行緒環境下會導致乙個執行緒獲得還沒有初始化的例項。例如,執行緒 t1 執行了 1 和 3,此時 t2 呼叫getuniqueinstance()
後發現uniqueinstance不為空,因此返回uniqueinstance,但此時uniqueinstance還未被初始化。
使用 volatile 可以禁止 jvm 的指令重排,保證在多執行緒環境下也能正常執行(保證執行緒安全)
關於this 的使用
如有不對的地方請大家指出,呵呵.this 的使用 1.this是指當前物件自己。當在乙個類中要明確指出使用物件自己的的變數或函式時就應該加上this引用。如下面這個例子中 public class a public static void main string args 執行結果 s hellow...
關於IT的我們
首先,對於廣大程式設計師,要先對程式設計師這個職業有個理性的認識。程式設計師不是什麼神聖的職業,這只是乙個普通的技術工種。我認為還算不上是it精英 當然精英的定位,每個人都有不一樣的標準 我個人認為,能自主發現問題,提出方案,構架程式結構的it人士才能算的上it精英。學會某種語言,了解某個領域的基本...
關於NSAutoReleasePool的理解
做iphone應用開發已經2年多了,但一些基礎的概念性問題只是大致了解,腦袋中有個模糊的概念.雖然對平時工作開發沒什麼影響,不過時間長了,心裡總是有點虛.所以從現在開始,每當我遇到乙個模糊概念的問題或topic,我都要寫一篇blog來記錄分析,響應之前在網上看過的乙個blog簽名 好記性不如爛部落格...