原理解析!你连基础的JVM运行时内存布局都忘了

Posted 2021Java面试题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原理解析!你连基础的JVM运行时内存布局都忘了相关的知识,希望对你有一定的参考价值。

Java就是个多线程的世界

1. 类的线程安全

我们经常说类是线程安全的,类是线程不安全的。那么什么样的类才是线程安全的?

1.1 定义

多线程环境下,不管不同的线程如何使用和调度这个类,这个类总是表现出正确的行为。那么这个类就是线程安全的。
类的线程安全有两个关键点:
1.操作的原子性
2.内存的可见性。

如果在多个线程中共享状态,当同步机制不正确时,就会出现线程不安全的情况。

简单的程序应该不会有线程安全问题吧?

Q:什么情况下会有线程安全问题

A:当某个实现多线程的线程类中有实例变量时

ps:有状态,无状态对象是什么概念

有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。

无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。

为什么有线程安全问题?必须要先了解计算机原理

当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。

举个例子

从内存读取1M数据 250微妙 = 250000纳秒
CPU读取一次内存 100纳秒

问:从内存中读取1M的int型数据由CPU进行累加,耗时要多久?

答:
1M的数据,Java里int型为32位,4个字节
共有1024*1024/4 = 262144个整数
CPU 计算耗时:262144 *0.6 = 157 286 纳秒

262144个整数从内存读取到CPU,需要耗时
内存读取耗时:262144*100+250000 = 26 464 400 纳秒

怎么解决线程安全问题?

线程安全问题,归根到底一句话:在多线程之间修改共享数据引起的

并发编程——从入门到成仙

为了让大家更好的理解学习线程并发,在这里给大家推荐一个由华为资深架构师Mark老师讲授的《并发编程——从入门到入仙》专题课程!从Java线程入门,到原子操作CAS与显式锁,再到并发安全,三天快速掌握并发编程核心知识,成为并发大神!

你以为这样就完了?更多并发相关资料,一并奉上!

总结

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。

此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!

给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

image

资料领取方式:点击这里免费下载

且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

image

以上是关于原理解析!你连基础的JVM运行时内存布局都忘了的主要内容,如果未能解决你的问题,请参考以下文章

jvm运行时内存解析

说一下 JVM 的内存布局和运行原理

JVM运行时数据区篇(基础认知)

JVM内存布局

初识JVM(JVM运行流程,JVM运行时数据区,内存布局中的异常)

一文搞懂 JVM 架构和运行时数据区 (内存区域)