熟悉Java中关键字 transient、instanceof、volatile、synchronized、final、static、原理及用法。
熟悉Java中关键字 transient、instanceof、volatile、synchronized、final、static、const 原理及用法。
目录
熟悉Java中关键字 transient、instanceof、volatile、synchronized、final、static、const 原理及用法。
transient
变量修饰符,用transient关键字标记的成员变量不参与序列化过程。
举个例子:
从下面这个例子可以看出:nodeType 这个属性我用的是transient 关键字修饰的,对对象序列化以后,nodeType 的值为NUll
instanceof
用来判断引用类型的变量所指向的对象是否是一个类(或者接口,抽象类,父类)的实例
常用的方法是:result=object instanceof classname.
如果Object是class的一个实例,那么instanceof运算符返回为true,不是(或者Object为null),那么结果返回false
举个例子:
volatile
volatile 关键字在线程同步时使用。
举个例子:
在单线程的情况下,我们定义一个变量,对变量进行一系列操作,没啥大问题。
但是在多线程情况下, 我们定义一个变量的话,当A 线程 将这个变量修改成100, B线程线程修改成了200,如果这是money的话岂不是凉凉, 而用volatile 修饰这个变量的话,线程B 那边显示的也是100 ,在线程的情况下是可见的。
volatile 原理:
当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
引自:https://www.cnblogs.com/zhengbin/p/5654805.html
synchronized
关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。
synchronized实现的三种方式:
- Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:
- 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
- 静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
- 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
举个例子:
多线程解析文件,我开启了三个线程执行10个文件。 解析文件的代码如果我照常写会出现什么问题呢? 你会发现解析文件不一致。存在同一个文件被多次执行。 这样就比较尴尬了。 所以一般情况下我们可以用synchronized关键字。
final
可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了
可以参考:https://blog.****.net/qq_34375473/article/details/81487803
static
格式:
修饰变量:static 数据类型 变量名
修饰方法:【访问权限修饰符】 static 方法返回值 方法名(参数列表)
应用场景:
如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量。
static如何去访问:
由于被static修饰的变量和方法是不属于任何实例对象的,所以在这里,强烈建议不要通过对象的方式去访问静态的变量或者方法。
静态变量:
类名.静态变量
对象.静态变量(不推荐的)
静态方法:
类名.静态方法
对象.静态方法(不推荐)
static使用注意事项:
在静态方法中没有this关键字因为静态是随着类的加载而加载,而this是随着对象的创建而存在的。
静态比对象优先存在。
静态可以访问静态的,但是静态不能访问非静态的。非静态的可以去访问静态的。