关键字volatile的主要作用是使变量在多个线程间可见。具体来说就是,volatile关键字,可以强制的从公共内存中读取变量的值,这样就不会因为私有堆栈中的值和公共堆栈中的值不同步而导致错误。
1.volatile 和 synchronized 的比较
1) volatile只能修饰于变量,而 synchronized可以修饰方法,以及代码块。
2) 多线程访问 volatile不会发生阻塞,而 synchronized会出现阻塞。
3) volatile能保证数据的可见性,但不能保证原子性。 synchronized两者都可以保证。
4) volatile解决的是变量在多个线程之间的可见性,而 synchronized解决的是多个线程之间访问资源的同步性。
2. i++操作时的非线程安全问题
表达式i++的操作步骤分解如下:
1)从内存中取出i的值
2)计算i的值
3)将i的值写到内存中
假如在第二步计算值的时候,另外一个线程也修改i的值,这时候就会出现脏数据。解决方法就是使用 synchronized关键字。
3.synchronized有和volatile一样的功能
synchronized不仅可以保证同步,还可以保证可见性。
在Java内存模型中,synchronized规定,线程在加锁时,先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中→释放互斥锁。