final、static、volatile、synchronized常见面试问题
目录
记住两点 final不可改变 static 静态全局.
final、finally、finalize的区别
- final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
- finally 是异常处理语句结构的一部分,表示总是执行.
- finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.
Static关键字
static 关键字可以用来修饰类的变量,方法和 内部类。static 是静态的意思,也就它定义的东西是全局的意思,属于全局与类相关,不与具体实例相关。就是说它调用的时候,只是ClassName.method(),而不是 new ClassName().method()。new ClassName()不就是一个对象了吗?static 的变量和方法不可以这样调用的。它不与具体的实例有关。
- JAVA类首次装入时,会对静态成员变量或方法进行一次初始化分配内存空间,但方法不被调用是不会执行的。所以静态内部类在调用时才加载分配空间。仔细一想:静态内部类其实和外部类的静态变量,静态方法一样,只要被调用了都会让外部类的被加载。
Static final为什么要一起用
final与static final的区别是:final在一个对象类唯一,static final在全局唯一;
final关键字的好处
- final关键字提高了性能。JVM和Java应用都会缓存final变量。
- final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
final类型的值是被保证其他线程访问该对象时,它们的值是可见安全的
- 使用final关键字,JVM会对方法、变量及类进行优化。
- 如果一个对象将会在多个线程中访问并且你并没有将其成员声明为final,则必须提供其他方式保证线程安全。
final与volatile的区别
- final修饰的变量时不能同时多个修改,这样来确保值得正确性。
- volatil修饰的变量主要是保证变量被写时其结果其他线程可见,强制每次都直接读内存,阻止重排序,确保voltile类型的值一旦被写入缓存必定会被立即更新到主存。
- volatile 是保证变量被写时其结果其他线程可见,final 已经让该变量不能再次写了。
volatile与synchronized
- volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,释放锁后,其他线程被才可以访问。
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
- volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性(也就是在写操作时别的线程无法访问,这样保证数据是理想值)
- volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。