Skip to content

volatile和synchronize的区别

volatile 和 synchronized 都是 Java 中用于处理多线程编程的关键字,但它们的作用和机制有所不同:

volatile 用于确保共享变量的可见性,它告诉编译器不要对被修饰的变量进行优化,每次访问变量时都直接从内存中读取最新的值。

Java
public class VolatileExample {
    private volatile boolean flag = false;

    public void toggleFlag() {
        flag = !flag;
    }

    public boolean isFlag() {
        return flag;
    }
}

在上面的示例中,flag 变量被声明为 volatile,这样在多个线程同时访问 flag 变量时,可以确保每次读取的都是最新的值。

synchronized 用于实现线程间的同步,它可以修饰方法或代码块,确保在同一时刻只有一个线程能够进入临界区。

Java
public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

在上面的示例中,increment() 和 getCount() 方法都被 synchronized 修饰,这样可以确保多个线程同时调用这两个方法时不会发生竞态条件,保证了计数器的正确性。

volatile 仅确保被修饰的变量的可见性,不提供原子性操作,适用于对变量的读写操作比较简单的情况。 synchronized 提供了更强的原子性和互斥性,可以确保多个线程对共享资源的操作具有原子性,适用于复杂的临界区操作。

总结

  1. volatile适用于读多写少的场景,尤其适合于状态标记量,保证变量的可见性和一定的有序性,但不适合复合操作。
  2. synchronized提供了更全面的线程安全保证,包括互斥性、可见性和原子性,适用于对数据完整性和一致性要求较高的场景,但相对更重,可能影响性能。

Released under the MIT License.