transient和synchronized這兩個關鍵字沒什麼聯絡,這兩天用到了它們,所以總結一下,兩個關鍵字做個伴!
transient
持久化時不被儲存,當你的物件實現了Serializable介面,這個物件就可以被儲存到磁碟上了,而有一些資訊比較敏感時,不想被持久化,就可以宣告為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 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