volatile关键字有什么用?
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码
int i1; int geti1() {return i1;}
volatile int i2; int geti2() {return i2;}
int i3; synchronized int geti3() {return i3;}
geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步)
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。
分享到:
相关推荐
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
#### 三、volatile与synchronized的比较 1. **应用范围**:`volatile`只能应用于变量级别,而`synchronized`可以应用于变量、方法甚至是代码块级别。 2. **性能差异**:通常情况下,`volatile`的性能优于`...
Java 中 volatile 和 synchronized 的区别与联系 Java 中的 volatile 和 synchronized 是两种不同的关键字,它们都是用来解决多线程编程中出现的问题,但是它们的作用机制和使用场景却不同。 volatile volatile ...
Java关键字volatile和synchronized作用和区别 Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量...
在Java多线程编程中,volatile和synchronized是两种重要的同步机制,用于处理并发环境下的数据一致性问题。这里我们将深入探讨这两个关键字的用法、作用以及它们之间的区别。 首先,volatile关键字。volatile确保了...
例如,合理使用volatile关键字可以减少不必要的缓存刷新,而明智地运用synchronized可以防止数据不一致,提高程序的正确性和可靠性。因此,深入学习并发编程的关键概念以及它们在现代计算机硬件上的实现,是成为高效...
本资源"并发编程一之synchronized和volatile.rar"提供了多个示例代码(demo1到demo12),帮助我们深入理解这两个关键字的功能与用法。 1. **synchronized关键字**: - **互斥性**:synchronized可以确保同一时间...
三、 volatile 和synchronized关键字的比较 1. volatile和synchronized都是Java中的同步机制,用于保证线程之间的可见性、原子性和有序性。 2. volatile只能保证可见性,而synchronized可以保证可见性、原子性和...
《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized ...
`volatile`和`synchronized`都是Java中的关键字,虽然它们都可以用于处理多线程同步问题,但作用机制不同。`volatile`确保了变量的修改对于其他线程是可见的,而`synchronized`则提供了互斥访问,保证同一时间只有...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块...理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。
理解和合理使用`synchronized`能够帮助我们构建稳定、高效的多线程程序,但同时也要注意避免潜在的死锁和性能问题。在实际编程中,应结合具体场景选择`synchronized`或者`ReentrantLock`等同步工具。
Java 多线程机制提供了两种实现同步的方式:Synchronized 和 Volatile。 1. Synchronized Synchronized 是 Java 语言中的一个关键字,用于实现线程同步。它可以保证在同一个时刻,只有一个线程可以执行某个方法...
Java并发编程中的Synchronized和Volatile详解 在Java并发编程中,Synchronized和Volatile是两个非常重要的概念,它们都是用于实现线程安全的机制。下面我们将详细介绍Synchronized和Volatile的区别和使用。 ...
Java线程之线程同步synchronized和volatile详解 Java线程同步是Java多线程编程中非常重要的一个方面,主要涉及到线程安全、可见性和有序性三个方面。Java提供了多种同步机制来解决线程安全问题,包括synchronized和...
例如,如果你有一个计数器并尝试通过多个线程同时递增,volatile并不能保证递增操作的原子性,因此仍然需要使用synchronized或者其他并发控制机制来保证。 下面是一些关于volatile的常见问题及其解答: 1. **参数...
- **volatile**:相比`synchronized`,`volatile`关键字轻量级且快速,但只适用于变量的读写操作,无法保证复合操作的原子性。 - **ReentrantLock**:是Java并发包`java.util.concurrent.locks`中的可重入锁,提供...
1. volatile只能修饰实例变量和类变量,而synchronized可以作用于方法和代码块,提供了更广泛的控制范围。 2. volatile仅保证数据的可见性和有序性,而不保证原子性,而synchronized则是全面的同步机制,既保证可见...
- `volatile`主要保证变量的可见性和有序性,但无法保证原子性,而`synchronized`则能保证原子性、可见性和有序性。 - `volatile`适用于读多写少的情况,而`synchronized`适用于读写都频繁的场景。 7. **死锁和...