当前位置: 首页 > news >正文

【java】基础内容(4)

简述java内存模型(JMM)

java内存模型定义了程序中各种变量的访问规则。其规定所有变量都存储在主内存,线程均有自己的工作内存。 工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。操作完成后,线程的工作内存通过缓存一致性协议将操作完的数据刷回主存。

简述as-if-serial

编译器等会对原始的程序进行指令重排序和优化。但不管怎么重排序,其结果和用户原始程序输出预定结果一致。 

简述happens-before八大原则

程序次序规则:一个线程内写在前面的操作先行发生于后面的。

锁定规则: unlock 操作先行发生于后面对同一个锁的 lock 操作。

volatile 规则:对 volatile 变量的写操作先行发生于后面的读操作。

线程启动规则:线程的 start 方法先行发生于线程的每个动作。

线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。

线程终止规则:线程中所有操作先行发生于对线程的终止检测。

对象终结规则:对象的初始化先行发生于 finalize 方法。

传递性规则:如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作 C

as-if-serial 和 happens-before 的区别

as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。 

 简述线程的可见性

可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。volatile,synchronized,final都能保证可见性。

java线程的实现方式

  1. 实现Runnable接口
  2. 继承Thread类。
  3. 实现Callable接口

简述java中volatile关键字作用

  1. 保证变量对所有线程的可见性。 当一条线程修改了变量值,新值对于其他线程来说是立即可以得知的。
  2. 禁止指令重排序优化。使用 volatile 变量进行写操作,汇编指令带有 lock 前缀,相当于一个内存屏障,编译器不会将后面的指令重排到内存屏障之前。

 简述Lock与ReentrantLock

Lock 接是 java并发包的顶层接口。

可重入锁 ReentrantLock 是 Lock 最常见的实现,与 synchronized 一样可重入。ReentrantLock 在默认情况下是非公平的,可以通过构造方法指定公平锁。一旦使用了公平锁,性能会下降。

 简述JVM内存模型

线程私有的运行时数据区: 程序计数器、Java 虚拟机栈、本地方法栈。

线程共享的运行时数据区:Java 堆、方法区。

 内存溢出和内存泄漏

内存溢出:程序在申请内存时,此时已用内存过多,没有足够的剩余内存空间供其使用。

内存泄漏:程序在申请内存后,不能完全释放已申请的内存空间。

控制反转(ioc) 

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

这个过程就叫控制反转 :

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

依赖注入 : 就是利用set方法来进行注入的.

IOC是一种编程思想,由主动的编程变成被动的接收

面向切面编程(aop)

AOP:直白点说就是实现调用某个方法之前或/和之后,自动执行一系列自定义的语句

springmvc的执行流程

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

什么是微服务

简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整个生命周期。 

 restful风格

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

自动装配原理

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入对应的start,就有对应的启动器,有了启动器,我们的自动配置就会生效,然后配置成功。

相关文章:

  • Perfetto分析进阶
  • Framework入门のPiex 6P源码(下载/编译/刷机)
  • 高端手机市场的诸神之战,vivo举起一把“雷神之锤”
  • 简单的ajax任务:get和post方式提交前端用户输入信息给服务器
  • Qt5开发从入门到精通——第四篇(调色板)
  • MySQL数据库如何线上修改表结构
  • Python利用pandas获取每行最大值和最小值
  • C++设计模式之装饰者模式(结构型模式)
  • 数据结构中,索引存储和散列存储区别较为详细的介绍
  • 基于ssm+vue的邮票收藏鉴赏系统 elementui
  • 去中心化标志符在DID中的核心地位
  • C++设计模式之适配器模式(结构型模式)
  • 3-面试官:说说线程池的 7 大参数
  • 猿创征文|HCIE-Security Day50:网络攻击介绍
  • 一个基于NetCore开发的前后端分离CMS系统
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 3.7、@ResponseBody 和 @RestController
  • ES6系列(二)变量的解构赋值
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mongodb--安装和初步使用教程
  • MySQL QA
  • Netty源码解析1-Buffer
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • XML已死 ?
  • 大型网站性能监测、分析与优化常见问题QA
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 我有几个粽子,和一个故事
  • 新版博客前端前瞻
  • 《天龙八部3D》Unity技术方案揭秘
  • elasticsearch-head插件安装
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​ubuntu下安装kvm虚拟机
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $.ajax()
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (07)Hive——窗口函数详解
  • (1)虚拟机的安装与使用,linux系统安装
  • (14)Hive调优——合并小文件
  • (4.10~4.16)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)ssm高校实验室 毕业设计 800008
  • (四)Linux Shell编程——输入输出重定向
  • (一)认识微服务
  • (转)Scala的“=”符号简介
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Micro Framework初体验
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。