变量可见性问题:
并发编程时,各个线程无法获取到共享变量的最新值。
产生的原因:
共享变量存储在主内存中,通常情况下各个线程在使用某个共享变量时先将共享变量复制进线程工作内存中,后续使用到该变量时直接从当前线程工作内存中获取变量值,此时如果其他线程更改了该共享变量值那么当前线程无法实时更新到该变量的最新值。
解决方式:
1、final:final修改的变量不可变,所以不存在变量可见性问题。
2、synchronized:进入同步代码块,先清空工作内存中的共享变量,从主内存中重新加载。解锁前必须把共享变量同步回主内存。
3、volatile:使用volatile变量时,必须重新从主内存加载,并且read、load是连续的。修改volatile变量之后,必须立马同步回主内存,并且store、write是连续的。示例:
synchronized和volatile区别
synchronized使用锁机制保护共享资源,只有获得锁的线程才可操作共享资源,同时synchronized语义规范保证了修改共享资源后会同步回主内存,从而做到线程安全。volatile因为没有锁机制,所以线程还是可以并发操作变量,所以没有做到线程安全
volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞
volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化