返回

一文徹底搞懂volatile关键字

Android





**一、volatile的由来** 

在Java语言诞生之初,并没有volatile关键字。当时,Java程序员只能通过synchronized关键字来保证共享变量的可见性和原子性。然而,synchronized关键字的性能开销很大,而且容易导致死锁。因此,在Java 5.0版本中,引入了volatile关键字,作为synchronized关键字的补充。

**二、volatile关键字的工作原理** 

volatile关键字可以保证共享变量的可见性和原子性。

**1. 可见性** 

volatile关键字可以保证共享变量的可见性,即当一个线程修改了共享变量的值时,其他线程能够立即看到这个修改。这是因为volatile关键字会强制Java虚拟机将共享变量的值存储在主内存中,而不是线程的本地内存中。这样,当其他线程访问共享变量时,就会从主内存中获取最新的值。

**2. 原子性** 

volatile关键字还可以保证共享变量的原子性,即当一个线程正在修改共享变量的值时,其他线程不能同时修改这个共享变量的值。这是因为volatile关键字会禁止Java虚拟机对共享变量进行指令重排。指令重排是指Java虚拟机可以改变指令的执行顺序,以提高程序的性能。然而,指令重排可能会导致共享变量的值出现不一致的情况。volatile关键字可以防止指令重排,从而保证共享变量的原子性。

**三、volatile关键字的应用场景** 

volatile关键字可以用于各种场景,其中最常见的是:

**1. 多线程通信** 

volatile关键字可以用于多线程通信,即当一个线程需要通知其他线程时,可以使用volatile关键字来修改一个共享变量的值。其他线程可以通过读取共享变量的值来了解到通知信息。

**2. 懒汉式单例模式** 

volatile关键字可以用于实现懒汉式单例模式。懒汉式单例模式是一种创建单例对象的方式,只有在第一次使用单例对象时才会创建该对象。volatile关键字可以保证单例对象的唯一性。

**3. 双重检查锁模式** 

volatile关键字可以用于实现双重检查锁模式。双重检查锁模式是一种创建单例对象的方式,可以提高创建单例对象的速度。volatile关键字可以保证双重检查锁模式的正确性。

**四、volatile关键字的局限性** 

volatile关键字虽然可以保证共享变量的可见性和原子性,但它并不能保证共享变量的顺序性。这意味着,当多个线程同时修改共享变量的值时,无法保证哪个线程的修改先执行。如果需要保证共享变量的顺序性,则需要使用synchronized关键字。

**五、volatile关键字与synchronized关键字的区别** 

volatile关键字和synchronized关键字都是Java多线程开发中非常重要的关键字。volatile关键字可以保证共享变量的可见性和原子性,而synchronized关键字可以保证共享变量的可见性、原子性和顺序性。volatile关键字的性能开销比synchronized关键字小,但它不能保证共享变量的顺序性。因此,在选择使用volatile关键字还是synchronized关键字时,需要根据具体情况进行权衡。