关键字

it2022-12-28  82

关键字

一、Java里final关键字怎么用二、Synchronized和lock三、volatile关键字四、Synchronized修饰静态方法,修饰成员变量

一、Java里final关键字怎么用

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰,final类中的成员变量可以根据需要设置为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法 。 使用final方法的原因有两个。第一个是把方法锁定,以防止仍和继承类修改它的含义;第二个是效率,在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到哦内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象

二、Synchronized和lock

Synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。JDK1.5后引入了自旋锁,锁粗化,轻量级锁,偏向锁来有优化关键字的性能。 Lock是一个接口,而Synchronized是Java中的关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

三、volatile关键字

volatile关键字是用来保证有序性和可见性的。这跟Java的内存模型有关。比如我们所写的代码,不一定时按照我们自己书写的顺序来执行的,编译器会做重排序,CPU也会做重排序,这样的重排序是为了减少流水线阻塞的,引起流水阻塞,比如数据相关性,提高CPU的执行效率。需要有一定的顺序和规则来保证,不然程序员自己写的代码都不知道对不对了,所以有了happens-before的规则,其中有条就是volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;有序性实现的时通过插入内存屏障来保证的。 可见性:首先Java内存模型分为,主内存,工作内存。比如线程A从主内存把变量从主内存读到了自己的工作内存中,做了加1的操作,但是此时没有将i的最新值刷新回主内存中,线程B此时读到的还是I的旧值。加了volatile关键字的代码生成的汇编代码发现,会多出一个Lock前缀指令,Lock指令对Intel平台的CPU,早期是锁总线,这样代价太高了,后面提出了缓存一致性协议(MESI)来保证多核之间数据不一致性的问题

四、Synchronized修饰静态方法,修饰成员变量

synchronized修饰静态方法以及同步代码块的synchronized(类.class)用法锁的是类,线程想要执行对应同步代码,需要获得类锁。 synchronized修饰成员变量方法,线程获取的是当前调用该方法的对象实例的对象锁

最新回复(0)