synchronized和volatile的区别
1、volatile
volatile是java的关键字,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中的值更新会使工作线程中的副本值失效。
保证内存可见性:某个线程修改了volatitle修饰的变量值,其他线程能够及时知道。
禁止指令重排序:当程序执行到volatitle修饰的变量的读写操作时,可以保证之前的语句已执行完,也能确定后面的逻辑还未执行
不保证原子性:volatitle不保证变量的任何操作都是原子性的,比如i++
2、synchronized
synchronized依赖于JVM,保证了同一时刻只能有一个线程在作用对象的作用范围内进行操作。内存可见性:线程在加锁时,先清空工作内存->在主存中拷贝最新变量副本到工作线程->执行完代码->将更改后的共享变量刷到主存中->释放互斥锁
操作的原子性:因为synchronized保证了同一时间只有一个线程对代码块进行操作,所以操作是原子性的。
有序性:第一条的特性决定,在多线程环境中,代码执行是有序的。
3、volatile和synchronized的区别
volatile不会加锁,比synchronized更轻量级,不会阻塞线程
volatile标记的变量不会被编译器优化而synchronized可以(比如编译器重排优化)
volatile是变量修饰符,而synchronized可以修改方法、变量、代码块、
volatile不保证原子性,synchronized可以保证原子性
他们都能保证内存可见性