java volatile的理解 - 面试宝典
【摘要】 Java中的volatile关键字是用来修饰变量的,它的作用是保证变量的可见性和禁止指令重排序。 当一个变量被volatile修饰时,它具有以下特性:可见性:当一个线程修改了volatile修饰的变量的值,其他线程能够立即看到修改后的值。这是由于volatile修饰的变量会直接存储在主内存中,每个线程读取变量时都会从主内存中获取最新的值。禁止指令重排序:编译器和处理器在不改变程序语义的前提下...
Java中的volatile关键字是用来修饰变量的,它的作用是保证变量的可见性和禁止指令重排序。 当一个变量被volatile修饰时,它具有以下特性:
- 可见性:当一个线程修改了volatile修饰的变量的值,其他线程能够立即看到修改后的值。这是由于volatile修饰的变量会直接存储在主内存中,每个线程读取变量时都会从主内存中获取最新的值。
- 禁止指令重排序:编译器和处理器在不改变程序语义的前提下,会对指令进行重排序优化以提高程序执行效率。然而,对于volatile变量的读写操作,编译器和处理器会禁止重排序,保证指令的执行顺序与程序的顺序一致。 示例代码如下:
javaCopy codepublic class VolatileExample {
private volatile boolean flag = false;
public void writer() {
flag = true; // 写入volatile变量
}
public void reader() {
while (!flag) { // 读取volatile变量
// do something
}
}
}
在上述代码中,有一个boolean类型的volatile变量flag。在writer方法中,将flag设置为true,而在reader方法中,通过不断循环读取flag的值,直到flag变为true时退出循环。 由于flag是volatile修饰的,所以在writer方法中修改flag的值后,reader方法中能够立即看到这个修改。这保证了可见性。 另外,由于reader方法中的循环条件中涉及到对flag的读取操作,而flag是volatile修饰的,所以编译器和处理器会禁止重排序,保证了指令的执行顺序与程序的顺序一致。这保证了禁止指令重排序。 需要注意的是,尽管volatile修饰的变量具有可见性和禁止指令重排序的特性,但并不能保证原子性。如果需要保证原子性操作,应该使用其他的同步机制,比如synchronized关键字或者Lock接口。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
皮牙子抓饭2023/08/12 01:54:571楼编辑删除举报