Java中的transient和synchronized的使用详解

分手后的思念是犯贱 2022-04-05 19:48 221阅读 0赞

transient和synchronized这两个关键字没什么联系,这两天用到了它们,所以总结一下,两个关键字做个伴!

transient

java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

持久化时不被存储,当你的对象实现了Serializable接口,这个对象就可以被存储到磁盘上了,而有一些信息比较敏感时,不想被持久化,就可以声明为transient,这时它只在内存中存在,保存到磁盘时将被忽略!

当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

  1. public class ExcelBean implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. private String headTextName;
  4. private String propertyName;
  5. private Integer cols = 0;
  6. private transient XSSFCellStyle cellStyle;
  7. }

上面代码中,cellStyle这个复杂对象不会被文件流写到磁盘里。

synchronized

同步关键字,当你的对象被实现化后,里面的方法可能被多个线程调用,这在web环境下很常见,如果希望为方法加个锁,让方法一个一个线程排队执行,最简单的方法就是加synchronized关键字,它可以保持这个方法同一时刻只有一个线程执行它。

synchronized可以用在方法上也可以使用在代码块中,其中方法是实例方法和静态方法分别锁的是该类的实例对象和该类的对象。而使用在代码块中也可以分为三种,具体的可以看上面的表格。这里的需要注意的是:如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系

  1. /**
  2. * 方法强制为同步方法.
  3. */
  4. synchronized void queue() {
  5. try {
  6. System.out.println("print synchronized result:" + LocalDateTime.now().toString());
  7. Thread.sleep(5000);
  8. } catch (Exception ex) {
  9. }
  10. }
  11. @Test
  12. public void synchronizedTest() throws Exception {
  13. for (int i = 0; i < 5; i++) {
  14. new Thread(() -> queue()).start();
  15. }
  16. Thread.sleep(500000);
  17. }

运行的结果如下,它总会被阻塞4秒钟,没有任务两个线程打印的时间相同。

  1. print synchronized result:2018-12-13T14:31:13.010
  2. print synchronized result:2018-12-13T14:31:18.015
  3. print synchronized result:2018-12-13T14:31:23.018
  4. print synchronized result:2018-12-13T14:31:28.023
  5. print synchronized result:2018-12-13T14:31:33.028

参考:

  • synchronized锁住的是代码还是对象
  • 让你彻底理解Synchronized

发表评论

表情:
评论列表 (有 0 条评论,221人围观)

还没有评论,来说两句吧...

相关阅读