Java并发 - Final关键字

本文详细介绍了Java中final关键字在变量、引用类型、方法和类上的应用,以及它如何提升线程安全性、可见性和避免指令重排序,强调了final在多线程编程中的重要性。
摘要由CSDN通过智能技术生成

1. final方法的基础使用

1.1 final修饰变量

在声明基本类型的变量时,我们可以使用final关键字使其成为常量。一旦赋值,这个值将无法再被修改。

final int MAX_VALUE = 100;
// MAX_VALUE = 200; // 重新给MAX_VALUE赋值时,编译错误,无法修改final变量

1.2 引用类型的final变量

对于引用类型的变量,final关键字确保引用不会再指向其他对象,但并不表示引用指向的对象的内容不可变。

final List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
// names = new ArrayList<>(); // 重新给names赋值,编译错误,无法修改final引用
names.add("Charlie"); // 但可以修改引用指向的对象的内容

1.3 final修饰方法

方法被final修饰的时候,该方法在子类不能被继承。private 作用域的方法可以理解为隐式的final方法,private作用域的方法同样无法被子类重写。

final方法能不能被重载???

final方法是可以被重载的!!!

class MyClass{
    final void myMethod(){
        // 该方法不能被重写
    }
    // final 是可以重载的
    // 当然重载的方法必须被final作用,否则编译错误
    final void myMethod(String str){
        System.out.println(str);
    }
}

1.4 final 修饰类

使用final关键字修饰类不能被继承,这种设计在某种情况下是非常有用的,例如:为了防止某个类的子类修改其行为。

final class MyFinalClass{
    // 该类无法被继承
}

2.0 final线程安全性

2.1 线程安全性

在多线程环境下,使用final关键字可以增强线程安全性。当一个对象被声明为final时,其状态无法被修改,从而避免了在多线程环境下的竞争条件。

// ImmutableObject类的实例是不可变的,因为它的状态(value字段)被声明为final,这使得对象在多线程环境下更加安全。
class ImmutableObject {
    private final int value;

    public ImmutableObject(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

2.2 可见性

使用final关键字还可以提高变量的可见性。当一个线程写入final变量时,其他线程可以立即看到这个变化,而不需要额外的同步机制。

// sharedValue字段被声明为final,确保了多线程环境下对getSharedValue()方法的调用是安全的,不需要额外的同步措施
class SharedResource {
    private final int sharedValue;

    public SharedResource(int sharedValue) {
        this.sharedValue = sharedValue;
    }

    public int getSharedValue() {
        return sharedValue;
    }
}

2.3 指令重排序

基本数据类型:

  • final域写:禁止final域写与构造方法重排序,即禁止final域写重排序到构造方法之外,从而保证该对象对所有线程可见时,该对象的final域全部已经初始化过。
  • final域读:禁止初次读对象的引用与读该对象包含的final域的重排序。

引用数据类型:

  • 禁止在构造函数对一个final修饰的对象的成员域的写入与随后将这个被构造的对象的引用赋值给引用变量重排序
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

--土拨鼠--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值