【388、synchronized和volatile的区别】

20 阅读2分钟

synchronized 和 volatile 都是 Java 中用于实现多线程同步的关键字,它们的主要区别如下:

  1. 功能不同

synchronized 是用于实现线程互斥和同步的关键字,可以保证在同一时刻只有一个线程可以执行该代码块,其他线程需要等待该线程执行完毕才能进入代码块执行。它可以修饰方法和代码块,并且是重量级锁。

volatile 是用于保证线程可见性和禁止指令重排的关键字,可以保证在多线程环境下,当一个线程修改了该变量的值时,其他线程可以立即看到修改后的值。它主要用于保证变量的内存可见性,但并不能保证原子性。

  1. 应用场景不同

synchronized 适用于需要多个线程共同访问临界资源的情况,通过互斥锁的机制,保证同一时刻只有一个线程可以访问共享资源,从而避免多个线程同时访问同一个临界资源时出现竞争问题和数据不一致问题。

volatile 主要用于实现变量在多个线程之间的可见性,适用于只有一个线程写变量,多个线程读变量的情况,用来保证所有线程都能看到变量的最新值,避免出现线程之间的数据不一致问题。

  1. 性能不同

synchronized 是重量级锁,它会涉及到线程的上下文切换和内核态和用户态的转换,会对程序的性能产生一定的影响。而 volatile 只是对变量进行标记,不涉及锁的获取和释放等操作,因此比 synchronized 更轻量级,性能更高。

综上所述,synchronized 和 volatile 在功能、应用场景和性能上都存在差异,需要根据具体情况选择适合的关键字。如果需要保证多个线程访问临界资源的互斥性,应该使用 synchronized;如果需要保证变量的内存可见性,应该使用 volatile。