Java中不常见的关键字 / 修饰符(volatile , native , transient)

    既然是不常见的 , 那public , private , static , final等之类的关键字都不在本次讨论范围之内了 . 如果这几个还不能理解的话 , 你就可以重新去学Java基础了 .

1 . volatile

  • 作用于变量上 , 是为了解决多线程中的变量可见性的问题 , 所谓的变量可见性 , 是因为多个线程访问同一个共享变量时 , 会为该变量在每个线程内创建变量副本 . 线程内所做的修改也并不会立即同步到原变量中 , 这样 , 当该变量改变时其他线程就无法感知 , 可能就无法访问到变量的最新值 .
  • Java语言为此提供了一种稍弱的同步机制 , 即volatile变量 , 用来确保将变量的更新操作通知到其他线程 . 用volatile关键字修饰的变量 , 多线程的修改会立即同步到原值 , 线程对变量读取的值也会读取原生值 .
  • volatile的读取性能与普通变量几乎相同 , 写操作相对稍慢 , 因为它需要在本地代码中插入许多内存屏障来保证处理器不发生乱序执行 , 即禁止指令重排优化 .
  • 在访问volatile变量时不会执行加锁操作 , 也就是不会线程阻塞 , 因此volatile变量是一种比synchronzied更轻量的同步机制 .

应用示例

  • Thread中 name , threadStatus
  • ConcurrentHashMap中 大量使用

2 . native

  • 作用于方法上 , 简单来讲就是指原生态的本地方法 . 方法的实现不是在当前文件(也不是抽象方法实现在子类中) , 而是在用其他语言C和C++实现的文件中 .
  • Java语言本身并不能对操作系统底层进行访问和操作 , 但是可以通过JNI (Java本地接口规范) 接口调用其他语言来实现对底层的访问 .

为什么要有native ?

    首先说明 , 这个特性并非Java独有 , 很多其他的编程语言都有这一机制 . Java是跨平台的语言 , 既然实现了跨平台 , 就牺牲了一些对操作系统的底层控制 , 或者用Java控制底层性能很差 .
    native 就是提供了一种非常简洁的机制 , 可以调用其他效率更高的语言来实现这些细节 .    

应用示例

  • Thread中 currentThread() , yield() , sleep()等
  • System中 currentTimeMillis()等
  • Object的 getClass() , hashCode() , clone()等

3 . transient

  • 作用于成员变量上 , 用来在序列化中排除该属性 . 一个对象只要实现了Serilizable接口 , 这个对象就可以被序列化 . 但在实际开发中 , 可能遇到某个类有些属性需要序列化 , 有些属性则不希望被序列化 , 如用户类的一些敏感信息(密码 , 银行卡号等) , 为了安全操作不希望在涉及到序列化的网络和本地操作 , 这些信息对应的变量就可以加上transient关键字 .
  • 换句话说 , 这个属性的生命周期仅存于调用者的内存中 , 而不会写到硬盘里持久化 .

另外 , 被transient关键字修饰的变量绝对不能被序列化吗?
大家可以参看下这个文章 , 也是有例外情况的 . 点击打开链接


猜你喜欢

转载自blog.csdn.net/xingbaozhen1210/article/details/80081379