java多线程关键字final和static详解

 更新时间:2020年01月08日 09:26:40   作者:sowhat1943  
这篇文章主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

final关键字

1.final关键字在单线程中的特点:   

1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次。

2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化、构造代码块和构造方法,并且仅能赋值一次。

3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是赋值),仅能赋值一次。

总之,final修饰的静态成员必须在类加载完之前进行赋值,final修饰的成员变量,必须在对象创建完之前进行赋值。

补充:final修饰的基本数据类型不能被重新赋值,final修饰的引用数据类型,引用类型的地址不能改变,引用类型的内部属性可以改变。

2. final在多线程的作用  

  由于重排序的作用,一个线程读取到一个对象的引用时,该对象可能尚未初始化完毕,即这些线程可能读取到该对象字段的默认值而不是初始值。

final关键字具有特殊的作用:当一个对象发布到其他线程的时候,该对象的所有final字段都是初始化完成的,即其他线程读取到的都是相应字段的初始值而不是默认值。而非final字段就没有这种保障。

对于final修饰的引用类型的字段,该字段还能保障该字段所引用的对象 初始化完毕。

这种机制是通过禁止重排序实现的:

对于final变量的写:禁止final域的写重排序到构造方法之外,即得到一个对象的引用时,其内部的final域必定已被初始化完毕。

对于final域的读:禁止初次读该对象的引用与读该对象包含的final域进行重排序。

这两种重排序都是底层是通过内存屏障实现的,编译器会在final域写之后,构造函数执行完之前插入一个storestore屏障,在读final域之前插入一个loadload屏障。

static关键字

static关键字能够保证一个线程即使在未使用其他线程同步机制的情况下也总是可以读到一个类静态变量的初始值,但这种可见性的保障仅限于 初次读取该变量

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVASE系统实现抽卡功能

    JAVASE系统实现抽卡功能

    这篇文章主要为大家详细介绍了JAVASE系统实现抽卡功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Java 中文字符按Unicode排序的实现方法

    Java 中文字符按Unicode排序的实现方法

    这篇文章主要介绍了Java 中文字符按Unicode排序的实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • 解析Java中所有错误和异常的父类java.lang.Throwable

    解析Java中所有错误和异常的父类java.lang.Throwable

    这篇文章主要介绍了Java中所有错误和异常的父类java.lang.Throwable,文章中简单地分析了其源码,说明在代码注释中,需要的朋友可以参考下
    2016-03-03
  • Java线程编程中Thread类的基础学习教程

    Java线程编程中Thread类的基础学习教程

    这篇文章主要介绍了Java线程编程中Thread类的基础学习教程,Thread类包含诸多操作线程的方法,非常重要,需要的朋友可以参考下
    2015-12-12
  • Java中获取webapp路径问题详解

    Java中获取webapp路径问题详解

    这篇文章主要介绍了Java中获取webapp路径问题详解,WebApp是指基于Web的 系统和 应用,其作用是向广大的最终用户发布一组复杂的内容和功能,本文详解了关于获取路径时候可能出现的问题,需要的朋友可以参考下
    2023-07-07
  • Android设备如何保证数据同步写入磁盘的实现

    Android设备如何保证数据同步写入磁盘的实现

    这篇文章主要介绍了Android设备如何保证数据同步写入磁盘的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 启用springboot security后登录web页面需要用户名和密码的解决方法

    启用springboot security后登录web页面需要用户名和密码的解决方法

    这篇文章主要介绍了启用springboot security后登录web页面需要用户名和密码的解决方法,也就是使用默认用户和密码登录的操作方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • java实现微博后台登录发送微博

    java实现微博后台登录发送微博

    这篇文章主要为大家详细介绍了java实现微博后台登录发送微博的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • SpringBoot整合Redisson实现分布式锁

    SpringBoot整合Redisson实现分布式锁

    本文主要介绍了SpringBoot整合Redisson实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • JAVA实现简单停车场系统代码

    JAVA实现简单停车场系统代码

    JAVA项目中正号需要一个停车收费系统,就整理出来java实现的一个简单的停车收费系统给大家分享一下,希望对大家有所帮助
    2017-04-04

最新评论