Java中的transient和synchronized的使用詳解
阿新 • • 發佈:2018-12-22
transient和synchronized這兩個關鍵字沒什麼聯絡,這兩天用到了它們,所以總結一下,兩個關鍵字做個伴!
transient
java語言的關鍵字,變數修飾符,如果用transient宣告一個例項變數,當物件儲存時,它的值不需要維持。換句話來說就是,用transient關鍵字標記的成員變數不參與序列化過程。
持久化時不被儲存,當你的物件實現了Serializable介面,這個物件就可以被儲存到磁碟上了,而有一些資訊比較敏感時,不想被持久化,就可以宣告為transient,這時它只在記憶體中存在,儲存到磁碟時將被忽略!
當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,然而非transient型的變數是被包括進去的。
public class ExcelBean implements Serializable {
private static final long serialVersionUID = 1L;
private String headTextName;
private String propertyName;
private Integer cols = 0;
private transient XSSFCellStyle cellStyle;
}
上面程式碼中,cellStyle這個複雜物件不會被檔案流寫到磁盤裡。
synchronized
同步關鍵字,當你的物件被實現化後,裡面的方法可能被多個執行緒呼叫,這在web環境下很常見,如果希望為方法加個鎖,讓方法一個一個執行緒排隊執行,最簡單的方法就是加synchronized關鍵字,它可以保持這個方法同一時刻只有一個執行緒執行它。
synchronized可以用在方法上也可以使用在程式碼塊中,其中方法是例項方法和靜態方法分別鎖的是該類的例項物件和該類的物件。而使用在程式碼塊中也可以分為三種,具體的可以看上面的表格。這裡的需要注意的是:如果鎖的是類物件的話,儘管new多個例項物件,但他們仍然是屬於同一個類依然會被鎖住,即執行緒之間保證同步關係。
/** * 方法強制為同步方法. */ synchronized void queue() { try { System.out.println("print synchronized result:" + LocalDateTime.now().toString()); Thread.sleep(5000); } catch (Exception ex) { } } @Test public void synchronizedTest() throws Exception { for (int i = 0; i < 5; i++) { new Thread(() -> queue()).start(); } Thread.sleep(500000); }
執行的結果如下,它總會被阻塞4秒鐘,沒有任務兩個執行緒列印的時間相同。
print synchronized result:2018-12-13T14:31:13.010
print synchronized result:2018-12-13T14:31:18.015
print synchronized result:2018-12-13T14:31:23.018
print synchronized result:2018-12-13T14:31:28.023
print synchronized result:2018-12-13T14:31:33.028
參考: