唯品会大数据面试题及参考答案(3万字长文)
synchronized 和 volatile 的区别
synchronized
是 Java 中的关键字,用于实现同步机制,确保在同一时刻只有一个线程可以访问被它修饰的代码块或方法。volatile
也是 Java 中的关键字,主要用于保证变量的可见性。
-
功能方面:
synchronized
可以保证原子性、可见性和有序性。它通过对代码块或方法加锁,使得同一时刻只有一个线程能够进入被保护的区域,从而避免了多个线程同时访问共享资源时可能出现的竞争条件和数据不一致问题。例如,在多线程环境下对一个变量进行自增操作,如果没有synchronized
保护,可能会出现线程安全问题,导致结果不准确。volatile
主要保证变量的可见性和禁止指令重排序。当一个变量被声明为volatile
时,编译器和处理器会保证对该变量的读写操作直接从主内存中进行,而不是从线程的本地内存中读取,从而确保了不同线程对该变量的可见性。同时,volatile
还可以禁止编译器和处理器对涉及该变量的指令进行重排序,以保证程序的执行顺序符合预期。
-
适用场景: