volatile 和 synchronized

94 阅读2分钟
  • volatile 关键字是一种轻量级的同步机制,主要用于保证变量在多线程之间的可见性。当一个线程修改了 volatile 变量的值,其他线程能够立即看到这个修改,因此可以用于简单的线程间通信。
  • synchronized 关键字则是一种更强大的同步机制,它不仅保证了可见性,还保证了原子性。当一个线程获得了对象的锁,在执行同步块或同步方法时,其他线程将被阻塞,直到该线程释放锁。这样可以确保多个线程之间的操作是互斥的,从而保证了共享资源的一致性。

区别总结:

  1. 适用范围:

    • volatile 关键字主要用于修饰变量,保证变量在多线程之间的可见性。
    • synchronized 关键字可以修饰方法和代码块,保证多线程对资源的同步访问。
  2. 实现原理:

    • volatile 关键字通过在字节码层面插入内存屏障来实现可见性,但无法保证原子性。
    • synchronized 关键字通过对象锁的机制来保证同一时刻只有一个线程可以执行被 synchronized 修饰的代码块或方法,从而保证了原子性。
  3. 性能:

    • volatile 关键字相比于 synchronized 更轻量级,性能更好,适用于简单的变量可见性场景。
    • synchronized 关键字由于涉及到锁的获取和释放,性能相对较差,适用于复杂的同步控制场景。
  4. 可见性和原子性:

    • volatile 关键字保证了变量在多线程之间的可见性,但不保证原子性。
    • synchronized 关键字既保证了可见性,也保证了原子性。

总体而言,选择使用 volatile 还是 synchronized 取决于具体的需求和场景,需要根据实际情况进行选择。