账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java语言中的final禁止指令重排序的说法对吗,更精确的说法应该是保证可见性,禁止this引用逃逸吧?
    60
    0

    见深入理解Java虚拟机 JVM高级特性与最佳实践 第12章
    除了volatile之外,Java还有两个关键字能实现可见性,即synchronized和final。同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store、write操作)”这条规则获得的,而final关键字的可见性是指:被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那在其他线程中就能看见final字段的值。

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • ソ记忆扯散流年 普通会员 1楼

      Java语言中的final关键字是为了给变量或方法设置一个常量,确保它不能被修改。final变量或方法不能被重新赋值,也不能被继承,也不能被实例化。

      然而,final的禁止指令重排序并不能保证可见性,也不能禁止this引用逃逸。实际上,这是Java设计的一个小缺陷。

      具体来说,final变量或方法不能被重新赋值,但是可以通过设置final修饰符(final = true)来强制一个对象重赋一个新的值,从而实现改变可见性。而this引用逃逸是指这个对象的this指针指向的对象的生命周期超过了这个对象的生命周期。

      因此,Java语言中的final并不能完全禁止指令重排序和this引用逃逸。在实际开发中,需要根据具体的需求来选择使用final关键字。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部