Java关键字总结
1.this:
(1)对象内部指代自身的引用
(2)解决成员变量和局部变量同名问题
(3)可以调用成员变量
(4)不能调用局部变量
(5)可以调用成员方法
(6)在普通方法中可以省略 this
(7)在静态方法当中不允许出现 this 关键字
2.super:
(1)代表对当前对象的直接父类对象的引用
(2)可以调用父类的非 private 成员变量和方法
(3)super(); 可以调用父类的构造方法,只限构造方法中使用,且必须是第一条语句
3.static
(1)static 可以修饰变量、方法、代码块和内部类
(2)static 变量是这个类所有,由该类创建的所有对象共享同一个 static 属性
(3)可以通过创建的对象名.属性名 和 类名.属性名两种方式访问
(4)static 变量在内存中只有一份
(5)static 修饰的变量只能是类的成员变量
(6)static 方法可以通过对象名.方法名和类名.方法名两种方式来访问
(7)static 代码块在类被第一次加载时执行静态代码块,且只被执行一次,主要作用是实现 static 属性的初始化
(8)static 内部类属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法
4.abstract
(1)可以修饰类和方法
(2)不能修饰属性和构造方法
(3)abstract 修饰的类是抽象类,需要被继承
(4)abstract 修饰的方法是抽象方法,需要子类被重写
5.instanceof
instanceof 运算符是用来在运行时判断对象是否是指定类及其父类的一个实例。
比较的是对象,不能比较基本类型
6.synchronized
synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。
- 作用:
(1)确保线程互斥地访问同步代码
(2)保证共享变量的修改能够及时可见
(3)有效解决重排序问题 - 用法:
(1)修饰普通方法
(2)修饰静态方法
(3)指定对象,修饰代码块 - 特点:
(1)阻塞未获取到锁、竞争同一个对象锁的线程
(2)获取锁无法设置超时
(3)无法实现公平锁
(4)控制等待和唤醒需要结合加锁对象的 wait() 和 notify()、notifyAll()
(5)锁的功能是 JVM 层面实现的
(6)在加锁代码块执行完或者出现异常,自动释放锁 - 原理:
同步代码块是通过 monitorenter 和 monitorexit 指令获取线程的执行权
同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制
7. volatile
volatile 关键字是一个类型修饰符。JDK 1.5 之后,对其语义进行了增强。
保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了共享变量的值,共享变量修改后的值对其他线程立即可见
通过禁止编译器、CPU 指令重排序和部分 happens-before 规则,解决有序性问题
volatile 可见性的实现
在生成汇编代码指令时会在 volatile 修饰的共享变量进行写操作的时候会多出 Lock 前缀的指令
Lock 前缀的指令会引起 CPU 缓存写回内存
一个 CPU 的缓存回写到内存会导致其他 CPU 缓存了该内存地址的数据无效
volatile 变量通过缓存一致性协议保证每个线程获得最新值
缓存一致性协议保证每个 CPU 通过嗅探在总线上传播的数据来检查自己缓存的值是不是修改
当 CPU 发现自己缓存行对应的内存地址被修改,会将当前 CPU 的缓存行设置成无效状态,重新从内存中把数据读到 CPU 缓存
本人才疏学浅,如有错误,烦请指出,谢谢!