Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2020-03-06:JMM是什么?它存在哪些问题?该如何解决?

Moosphan opened this issue · comments

commented

JMM,我搜了一下是Java内存模型。如果不是这个意思,那就是我理解错了。【真不喜欢使用不广泛缩写】

它的本质是人为规定的协议或模型,通过这个协议,解决多个处理器处理主内存时,缓存不一致的问题。因此,它并不存在什么问题,而是解决了缓存一致性问题。

缓存一致性问题:原子性、可见性、有序性

Java内存模型
存在的问题就是多线程对共享数据的读写一致性问题
可以通过synchronized、cas、并发安全的数据结构、aqs组件来解决

java内存模型:定义了共享内存系统中多线程程序读写操作行为的规范,Java内存模型也就是为了解决这个并发编程问题而存在的
怎么解决:内存模型解决并发问题主要采取两种方式,分别是限制处理器优化,另一种是使用了内存屏障。
而对于这两种方式,Java底层其实已经封装好了一些关键字,我们这边只需要用起来就可以了。
关于解决并发编程中的原子性问题,Java底层封装了Synchronized的方式,来保证方法和代码块内的操作都是原子性的;
而至于可见性问题,Java底层则封装了Volatile的方式,将被修饰的变量在修改后立即同步到主内存中。
至于有序性问题,其实也就是我们所说的重排序问题,Volatile关键字也会禁止指令的重排序,而Synchroinzed关键字由于保证了同一时刻只允许一条线程操作,自然也就保证了有序性。

参考文档,JMM是什么和面什么