在Java并发编程中,volatile和synchronized是两个至关重要的关键字,它们帮助开发者解决多线程环境下的可见性、原子性和有序性问题。
一. 简介
1. Volatile
volatile是一个类型修饰符,用来确保对一个变量的读取和写入操作不会被编译器重排序,并且每次读取都直接从主内存中获取最新值,写入时也直接写入主内存,从而保证了多线程环境下的可见性。但需要注意的是,volatile不能保证复合操作(如count++)的原子性。
volatile关键字用于确保变量的可见性(visibility)和有序性(ordering),但不保证原子性(atomicity)。
2. Synchronized
synchronized关键字可以用于方法或代码块,它提供了一种锁机制,确保同一时间只有一个线程可以执行特定的代码段,从而达到线程互斥的效果。synchronized不仅保证了可见性,还确保了操作的原子性以及有序性,是更强大的并发控制工具。
二、用法
1. Volatile 的使用
public class VolatileExample {
private volatile int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
在这个例子中,虽然count使用了volatile,但increment()方法并不是线程安全的,因为count++不是原子操作。然而,getCount()能保证读取到最新的count值。
2 Synchronized 的使用
- 方法级别
public class SynchronizedExample {
private int count = 0;
public synchronized void increment(