目录

final、static、volatile、synchronized常见面试问题

记住两点 final不可改变 static 静态全局.

final、finally、finalize的区别

  1. final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
  2. finally 是异常处理语句结构的一部分,表示总是执行.
  3. finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.

Static关键字

static 关键字可以用来修饰类的变量,方法和 内部类。static 是静态的意思,也就它定义的东西是全局的意思,属于全局与类相关,不与具体实例相关。就是说它调用的时候,只是ClassName.method(),而不是 new ClassName().method()。new ClassName()不就是一个对象了吗?static 的变量和方法不可以这样调用的。它不与具体的实例有关。

  • JAVA类首次装入时,会对静态成员变量或方法进行一次初始化分配内存空间,但方法不被调用是不会执行的。所以静态内部类在调用时才加载分配空间。仔细一想:静态内部类其实和外部类的静态变量,静态方法一样,只要被调用了都会让外部类的被加载。

Static final为什么要一起用

final与static final的区别是:final在一个对象类唯一,static final在全局唯一

final关键字的好处

  1. final关键字提高了性能。JVM和Java应用都会缓存final变量。
  2. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

final类型的值是被保证其他线程访问该对象时,它们的值是可见安全的

  1. 使用final关键字,JVM会对方法、变量及类进行优化。
  2. 如果一个对象将会在多个线程中访问并且你并没有将其成员声明为final,则必须提供其他方式保证线程安全。

final与volatile的区别

  1. final修饰的变量时不能同时多个修改,这样来确保值得正确性。
  2. volatil修饰的变量主要是保证变量被写时其结果其他线程可见,强制每次都直接读内存,阻止重排序,确保voltile类型的值一旦被写入缓存必定会被立即更新到主存。
  3. volatile 是保证变量被写时其结果其他线程可见,final 已经让该变量不能再次写了。

volatile与synchronized

  1. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,释放锁后,其他线程被才可以访问。
  2. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
  3. volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性(也就是在写操作时别的线程无法访问,这样保证数据是理想值)
  4. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。