1.说说java内存模型,内存模型的变化带来了什么问题,怎么解决这个问题?
2.说说synchronized关键字和volatile关键字的区别
Q:说说java内存模型,内存模型的变化带来了什么问题,怎么解决这个问题?
A:
在jdk1.2前线程如果想修改主内存中变量的值是可以直接修改的。
但是现在jdk的内存模型是:
如果线程想修改主内存中变量的值,需要先把它读到线程自己的工作内存中,然后在工作内存中进行变量的修改,然后把修改后的变量再写回主内存中。
内存模型的变化带了数据的不一致性问题。当主内存中的一个变量被一个线程修改后,另一个线程还以为这个变量是之前自己工作内存中的值,这样就出现了数据的不一致性问题。
可以在变量前加上volatile关键字,来保证该变量在主内存对其它线程的可见性。
当变量加上volatile关键字后,说明该变量是不稳定的(volatile),以后读取和写入该变量都变成直接的方式,不经过工作内存。
volatile关键字加在变量上,作用1是保证该变量在主内存对其它线程的可见性,作用2是可以禁止指令重排序。
Q:说说synchronized关键字和volatile关键字的区别
A:
解决的问题不同 可见性和原子性保证的不同 阻塞性不同 作用范围不同 性能不同
volatile主要用来保证变量对于不同线程的可见性。
synchronized主要用来保证线程同步。
volatile只能保证可见性,但不能保证原子性。而synchronized都能保证。
多个线程访问volatile修饰的变量不会阻塞,但是synchronized会阻塞。
volatile作用在变量上,synchronized作用在方法和代码块上。
volatile为轻量级的,性能比synchronized要好。