天天看点

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

作者:程序员叶伟

java程序员常见面试题:Java内存模型到底是个什么鬼?

90%以上的同学可能都不太清楚Java内存模型到底是个什么东西。虽然在工作中可能或多或少都会用到多线程,也会接触到对同一个变量的并发访问。大家应该都会想到syntronized对吧?但是其中的原理是什么?可能还是有一些模糊只知道这么用。

说到java内存模型,它的设计的初衷就是为了定义程序中多线程访问时各个变量的访问规则。这里的变量与java中变成所常说的这个变量是不一样的,它只包括了一些实例字段。比如一个类中的一个成员变量或者是静态变量对吧?这些变量有一个共同的特征,就是属于一个共享的资源,所有的线程都能够去访问到的。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

这个资源它是不包括局部变量的。比如说在方法里面去做一个变量的定义,这个变量是不属于共享变量的,它是属于线程私有的变量,不属于Java内存模型考虑的范围。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

Java内存模型中有两个特别重要的概念,一个是主内存,一个是工作内存,它是不同于JVM堆内存的,属于另外一个维度的划分。主内存它是存储所有的共享变量的,就是刚刚说的这个什么类的成员或者静态字段。这些被共享的字段是存储在主内存中的,而每一个线程都有一个独立于主内存的工作内存,就是每一个线程都有一个工作内存。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

工作内存除了自身的一些私有变量以外还会存储共享内存的副本。比如静态的字段所有的线程都会访问到。如果某一个线程用到了静态字段,那么在线程的工作内存中就会有一个静态字段对应的副本。线程只能操作自己的工作内存,不能够直接操作主内存,这个是核心。如果线程在本地,它比如更新了某一个共享变量,某一个静态字段。等到更新完成之后java内存模型就会自动的把更新后的值刷到主内存中,这个是内存模型的工作原理。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

但是在使用java内存模型的时候还是有几点需要特别注意的,一个就是所谓的可见性的问题,就是线程在读取共享变量的时候可能得到的是过期的值,因为这个值可能是在别的线程中被修改过了。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

这种情况如果是需要让其他的线程能够实时的去做一个更新,就需要在变量上面去加一个Volatile的修饰来保证它的可见性。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

·第二个是原子性的问题,比如多个线程对共享变量进行了非原子化的操作,就会导致数据的不一致的问题。比如i++就可能出现不一致的问题,因为这是非原子化的操作,解决方案很简单。常见的在它的参数上面去加一个syntronized修饰。

java常见面试题:聊聊你对java内存模型的看法 @抖音短视频

·另外还有重排序的问题,简单来讲是它需要对某一个变量,它的执行顺序做一个重排序以达到效率的最大化,但是这种情况可能会导致数据不一致的问题。同样也是需要通过volatile或者syntronized来进行修饰。

本期的视频就是这些了,如果您对本期的内容有任何疑问,欢迎大家在评论区给我留言,谢谢大家。