`

java volatile关键字

    博客分类:
  • java
 
阅读更多

volatile关键字有什么用?

举个例子:

private volatile int v;
public void func(){ 
     int a=5*v;
     int b=5*v;
     ....
}
     如果v是个普通的变量,编译器很可能会做这样的优化,   第一次计算出5*v的值后,先赋给a,然后直接又从寄存赋给b,   而不会重新计算5*v, 如果这个时候其他线程改变了v的值,而本线程又没有去“主”内存里面取新的v值,就会造成b值的不正确。如果定义成volatile,编译器则不会做任何优化,每次都会重新读取v的值。
 

volatile和synchronized的有什么不同?

private int i1;
private volatile int i2;              
private int i3;
public int geti1() {
     return i1;
} 

public int geti2(){
     return i2;
} 
              
public synchronized int geti3() {
     return i3;
} 
     Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。 
     而 geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经 volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。 
     既然volatile关键字已经实现了线程间数据同步,又要 synchronized干什么呢?它们之间有两点不同。
     首先,synchronized需要获得并释放对象锁。其次,synchronized在“ 主”内存区域同步整个线程的内存。因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。 
     执行geti3()方法做了如下几步:
 
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放) 
2. 线程内存的数据被消除,从“主”内存区域中读入
3. 代码块被执行 
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值) 
5. 线程释放监视this对象的对象锁 
分享到:
评论

相关推荐

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    java volatile 关键字 学习

    java volatile 关键字 学习

    Java Volatile关键字同步机制详解

    Java Volatile关键字同步机制详解 Java Volatile关键字是Java语言中的一种同步机制,它可以保证在多线程环境下变量的可见性和原子性。通过使用Volatile关键字,可以确保在多线程环境下对变量的修改是可见的,并且...

    Java volatile关键字详解.docx

    volatile

    java volatile关键字使用方法及注意事项

    volatile关键字在Java编程语言中扮演着重要的角色,特别是在多线程环境下的同步和可见性问题。它是Java内存模型(JMM)的一部分,用于确保共享变量的可见性和有序性,但不保证原子性。 1. **volatile的可见性**:当...

    Java并发编程:volatile关键字解析

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

    深入解析Java中的volatile关键字:原理、应用与实践

    在Java并发编程中,volatile关键字是一种轻量级的同步机制,它用于确保变量的可见性和有序性。本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发...

    java里的volatile关键字详解

    "Java中的Volatile关键字详解" Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见...

    Java并发volatile关键字.docx

    Java并发编程中,volatile关键字扮演着重要的角色,它是一种轻量级的同步机制,与synchronized相比,volatile在性能上更优,因为它不会导致线程阻塞。在深入理解volatile的关键特性之前,我们需要先了解Java内存模型...

    Java——volatile关键字详解

    Java中的`volatile`关键字是一个非常重要的并发控制工具,它提供了比`synchronized`关键字更为轻量级的同步机制。`volatile`关键字的主要作用是确保多线程环境下的可见性和禁止指令重排序,但不保证原子性。 **...

    java volatile关键字作用及使用场景详解

    Java中的`volatile`关键字是一个非常重要的并发编程工具,它的主要作用是确保共享变量在多线程环境下的可见性和有序性。下面将详细解释`volatile`的关键特性、它如何解决并发问题以及相关的`happens-before`原则。 ...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    Java中volatile关键字实现原理

    Java中volatile关键字实现原理 volatile关键字是Java语言中的一种机制,用于保证变量在多线程之间的可见性。它是Java.util.concurrent包的核心,没有volatile就没有那么多的并发类供我们使用。本文详细解读一下...

    Java Volatile关键字实现原理过程解析

    Java中的`volatile`关键字是并发编程中至关重要的一个特性,它用于解决多线程环境下的可见性和有序性问题。在Java内存模型(JMM)中,`volatile`关键字确保了共享变量在多线程间的正确通信。 首先,我们来看`...

    java语言的volatile教程,java语言的volatile关键字是干什么用的

    java语言的volatile教程,java语言的volatile关键字到底怎么用

    简单了解java volatile关键字实现的原理

    Java中的`volatile`关键字是用来解决多线程环境下的可见性和有序性问题的,它确保了共享变量在被修改后,其他线程能够立即看到最新的值,但并不保证操作的原子性。下面我们将深入探讨`volatile`关键字的原理、使用...

    java里的volatile关键字详解.pdf

    java里的volatile关键字详解.pdf

    java volatile关键字的含义详细介绍

    Java中的`volatile`关键字是用来解决多线程并发访问共享变量时的可见性和有序性问题的。在Java中,每个线程都有自己的工作内存,用于存储从主内存中复制的变量副本。如果没有同步措施,线程间无法直接感知彼此对共享...

    C++中volatile关键字及常见的误解总结

    在C++中,volatile关键字的定义与Java中的volatile关键字不同。C++中的volatile关键字主要用于提供对特殊地址的稳定访问,而不是用于线程同步。 在编译器对代码的优化中,编译器可能会对代码进行修改,以提高代码的...

Global site tag (gtag.js) - Google Analytics