transient和synchronized的使用

張佔嶺發表於2018-12-13

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

相關文章