1. 程式人生 > >transient和synchronized的使用

transient和synchronized的使用

col bean 對象 out serial stat prop 忽略 如果

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

transient和synchronized的使用