淺談高級關鍵字在多線程編程中的應用

    **一個實現Serializable的類的對象纔可以序列化,實現序列化的對象可以以數據流的形式傳輸。 Serializable接口中任何的方法。當一個類聲明要實現Serializable接口時,只是表明該類參加序列化協議。
	java.io包中,提供了ObjectInputStream和ObjectOutputStream將數據流功能擴展至可讀寫對象。在ObjectInputStream中用readObject()方法可以直接讀取一個對象,ObjectOutputStream中用writeObject()方法可以直接將對象保存到輸出流中。
	*序列化只能保存對象的非靜態成員變量,不能保存任何成員方法和靜態成員變量,而且序列化保存的只是變量的值,對於變量的任何修飾符都不能保存***

transient關鍵字
1、對於某些類型的對象,其狀態是瞬時的,這樣的對象是無法保存其狀態的。例如一個Thread對象或一個FileInputStream對象,對於這些字段,我們必須用transient關鍵字標明,否則編譯器將報錯。
2、另外,串行化可能涉及將對象存放到磁盤上或在網絡上發送數據,這時候就會產生安全問題。因爲數據位於java運行環境之外,不在java安全機制的控制之中。對於這些需要保密的字段,不應保存在永久介質中,或者不應簡單地不加處理的 保存下來,爲了保證安全性。應該在這些字段前加上transient關鍵字。
3、transient是類型修飾符,只能用來修飾字段。在對象序列化的過程中,標記爲transient的變量不會被序列化。
4、 序列化:把一個對象轉化爲字節流的過程。
反序列化:從字節流中把對象重建出來稱爲反序列。

volatile 關鍵字
* 先了解下synchronized 所有加上synchronized和塊語句,在多線程訪問的時候,同一時刻只能有一個線程能夠用synchronized修飾的方法或代碼塊。
* volatile介紹:
volatile用在多線程,同步變量。線程爲了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實訪問的是B。只在某些動作是才進行A和B的同步。因此存在A和B不一致的情況。volatile就是用來避免這種情況的。
volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的值,即被volatile修飾的成員 變量在線程調用是要求程序從內存讀出它最新的值。

關鍵字volatile和synchronized二者之間的區別?
首先volatile關鍵字實現了線程間數據同步,而synchronized獲得並釋放監視器—如果兩個線程使用了同一個對象鎖,監視器能強制保證代碼塊同時只被一個線程所執行,但是synchronized也同步內存:事實上,synchronized在“主”內存區域同步整個線程的內存。
有以下幾點:
1、線程請求獲得監視this對象的對象鎖(假設未被鎖,否則線程等待知道鎖釋放)
2、線程內存的數據被消除,從“主”內存區域中讀入
3、線程釋放監視this對象的對象鎖
因此volatile只是在線程內存和“主”內存間同步某個變量的值,而synchronized通過鎖定和解鎖某個監視器同步所有變量的值。顯然synchronized要比volatile消耗更多資源。

volatile關鍵字用於聲明簡單類型變量,如int、float、Boolean等數據類型。如果這些簡單數據類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章