乐趣区

关于java:面试1v1实景模拟面试中常见的Java关键字详解

老面👴:Java 中有哪些关键字

笑小枫🍁:

  1. 用于数据类型
    用于数据类型的关键字有 boolean、byte、char、double、float、int、long、new、short、void、instanceof。
  2. 用于语句
    用于语句的关键字有 break、case、catch、continue、default、do、else、for、if、return、switch、try、while、finally、throw、this、super。
  3. 用于润饰
    用于润饰的关键字有 abstract、final、native、private、protected、public、static、synchronized、
    transient、volatile。
  4. 用于办法、类、接口、包和异样
    用于办法、类、接口、包和异样的关键字有 class、extends、implements、interface、package、import、throws。
  5. 其余
    还有些关键字, 如 future、generic、operator、outer、rest、var 等都是 Java 保留的没有意义的关键字。另外,Java 还有 3 个保留字:goto、const、null。它们不是关键字,而是文字。蕴含 Java 定义的值。和关键字一样, 它们也不能够作为标识符应用。

老面👴:简略介绍一下 final 关键字

笑小枫🍁:final 关键字能够用来润饰援用、办法和类。

  1. 润饰援用
  2. 如果援用为根本数据类型,则该援用为常量,该值无奈批改;
  3. 如果援用为援用数据类型,比方对象、数组,则该对象、数组自身能够批改,但指向该对象或数组的地址的援用不能批改。
  4. 如果援用时类的成员变量,则必须当场赋值,否则编译会报错。
  5. 润饰办法
    当应用 final 润饰办法时,这个办法无奈被子类重写。然而,该办法依然能够被继承。
  6. 润饰类
    当用 final 批改类时,该类成为最终类,无奈被继承。

老面👴:简略介绍一下 this、super 关键字

笑小枫🍁:this: 代表以后对象的援用,谁来调用我我就代表谁。super: 代表以后对象对父类的援用。

  1. 调用成员变量不同;
    this:成员变量 调用本类的成员变量,也能够调用父类的成员变量。
    super:成员变量 调用父类的成员变量。
  2. 调用构造方法不同。
    this:调用本类的构造方法。
    super:调用父类的构造方法。
  3. 调用成员办法。
    this:成员办法 调用本类的成员办法,也能够调用父类的办法。
    super:成员办法 调用父类的成员办法。

老面👴:简略介绍一下 static 关键字

笑小枫🍁:

  1. static 是一个修饰符,用于润饰成员。(成员变量,成员函数)static 润饰的成员变量 称之为动态变量或类变量。
  2. static 润饰的成员被所有的对象共享。
  3. static 优先于对象存在,因为 static 的成员随着类的加载就曾经存在。
  4. static 润饰的成员多了一种调用形式,能够间接被类名所调用,(类名. 动态成员)。
  5. static 润饰的数据是共享数据,对象中的存储的是特有的数据。

老面👴:简略介绍一下 volatile 关键字

笑小枫🍁:volatile 是 java 虚拟机提供的轻量级同步机制,用于示意能够被多个线程异步批改的成员变量,其特点有: 1. 保障可见性 2. 禁止指令重排 3. 不保障原子性

1、volatile 可见性实现原理:

变量被 volatile 关键字润饰后,底层 汇编指令 中会呈现一个lock 前缀指令。会导致以下两种事件的产生:

  1. 批改 volatile 变量时,会强制将批改后的值刷新到主内存中。
  2. 批改 volatile 变量后,会导致其余线程工作内存中对应的变量值生效。因而,再读取该变量值的时候就须要从新从读取主内存中的值。

2、volatile 有序性实现原理:

指令重排序:编译器在不扭转单线程程序语义的前提下,重新安排语句的执行程序,指令重排序在单线程下不会有问题,然而在多线程下,可能会呈现问题。

volatile 有序性的保障就是通过 禁止指令重排序 来实现的。指令重排序包含编译器和处理器重排序,JMM 会别离限度这两种指令重排序。禁止指令重排序又是通过加 内存屏障 实现的。

JMM:JMM(java 内存模型 Java Memory Model 简称 JMM) 自身是一个形象的概念, 并不在内存中实在存在的, 它形容的是一组标准或者规定, 通过这组标准定义了程序中各个变量 (实例字段, 动态字段和形成数组对象的元素) 的拜访形式.
JMM 的同步规定:
 1. 线程解锁之前, 必须把共享变量刷新回主存
 2. 线程加锁锁之前, 必须读取主存的最新值到本人的工作空间
 3. 加锁解锁必须是 同一把锁

内存屏障(memory barriers):一组处理器指令,用于实现对内存操作的程序限度。

3、volatile 为什么不保障原子性?

java 中只有对变量的赋值和读取是原子性的,其余的操作都不是原子性的。所以即便 volatile 即便能保障被润饰的变量具备可见性,然而不能保障原子性。


老面👴:简略介绍一下 synchronized 关键字

笑小枫🍁:可用来给对象和办法或者代码块加锁,当它锁定一个办法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

在晚期的 java 版本,synchronized 关键字属于重量级锁,效率低下。jdk1.6 之后有了优化。

synchronized 在 java 内存模型中次要有 3 种作用,别离是:

  • 原子性:通过 monitorenter 和 monitorexit 指令, 保障被 synchronized 润饰的代码在同一时间只能被一个线程拜访,在锁未开释之前,无奈被其余线程拜访到
  • 可见性:保障共享变量的批改可能及时可见, 对一个变量的 unlock 操作之前,必须把此变量同步回主内存中(store 和 write 操作)
  • 有序性:一个变量在同一时刻只容许一条线程对其执行 lock 操作,这条规定决定了持有同一个锁的两个同步块只能串行执行

synchronized 的底层实现原理

  • 原子性实现原理
    synchronized 实现原子性底层是通过 JVM 来实现的,同一时间只能有一个线程去执行 synchronized 中的代码块;
    每一个对象都有一个监视器 monitor 来关联,监视器被占用时会被锁住,其余线程无奈获取该 monitor, 当 JVM 执行某个线程的的外部办法的 monitorenter, 它会尝试去获取该对象的 monitor 的所有权,过程如下:
  • 若 monitor 的进入数为 0,线程能够进入 monitor, 并将该 monitor 的进入数置为 1,那么该线程就成为 monitor 的所有者
  • 若线程已领有 monitor 的所有权,容许它重入 monitor,则进入 monitor 的进入数加 1(recursions:记录线程领有锁的次数)
  • 若其余线程曾经占有 monitor 的所有权,那么以后尝试获取 monitor 的所有权的线程会被阻塞,直到 monitor 的进入数变为 0,能力从新尝试获取 monitor 的所有权。

    monitorexit 指令

    1. 能执行 monitorexit 指令的线程肯定是领有以后对象的 monitor 的所有权的线程。
    2. 当执行 monitorexit 时会将 monitor 的进入数减 1。当 monitor 的进入数减为 0 时,以后线程退出 monitor,不再领有 monitor 的所有权,此时这个 monitor 阻塞的线程能够尝试去获取这个 monitor 的所有权。
  • 可见性实现原理
    synchronized 通过内存屏障保障可见性,同样的咱们晓得 volatile 是通过内存屏障来保障可见性的,
  • monitorenter 指令之后,synchronized 外部的共享变量,每次读取数据的时候被强制从主内存读取最新的数据。
  • monitorexit 指令也具备 Store 屏障的作用,也就是让 synchronized 代码块内的共享变量,如果数据有变更的,强制刷新回主内存。
    数据批改之后立刻刷新回主内存,其余线程进入 synchronized 代码块后,应用共享变量的时候强制读取主内存的数据。
  • 有序性实现原理
    同样的,synchronized 也是通过 monitorenter、monitorexit 指令嵌入下面的内存屏障, 既具备加锁、开释锁的性能,同时也具备内存屏障的性能

老面👴:简略介绍一下 break、continue 关键字

笑小枫🍁:

break用于齐全完结一个循环,跳出循环体,执行循环前面的语句。

continue是跳过当次循环中剩下的语句,执行下一次循环。


老面👴:简略介绍一下 trabsient 关键字

笑小枫🍁:被 transient 润饰的变量不参加序列化和反序列化。当一个对象被序列化的时候,transient 型变量的值不包含在序列化的示意中,然而非 transient 型的变量是被包含进去的。


老面👴:简略介绍一下 instanceof 关键字

笑小枫🍁:在 Java 中能够应用 instanceof 关键字判断一个对象是否为一个类(或接口、抽象类、父类)的实例


老面👴:简略介绍一下 extends、implements 关键字

笑小枫🍁:

extends 是继承某个类, 继承之后能够应用父类的办法, 也能够重写父类的办法

implements 是实现多个接口, 接口的办法个别为空的, 必须实现能力应用


老面👴:简略介绍一下 native 关键字

笑小枫🍁:native 次要用于办法上,native 办法是指该办法的实现由非 Java 语言实现,比方用 C 或 C ++ 实现。

次要是因为 JAVA 无奈对操作系统底层进行操作,然而能够通过 jni(java native interface)调用其余语言来实现底层的拜访。

PS:JNI 是 Java 本机接口(Java Native Interface),是一个本机编程接口,它是 Java 软件开发工具箱(java Software Development Kit,SDK)的一部分。JNI 容许 Java 代码应用以其余语言编写的代码和代码库。Invocation API(JNI 的一部分)能够用来将 Java 虚拟机(JVM)嵌入到本机应用程序中,从而容许程序员从本机代码外部调用 Java 代码。

退出移动版