一、JMM
1.1、JMM简介
JMM 是Java内存模型( Java Memory Model),简称JMM。它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。
计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程,跟CPU执行指令的速度比起来要慢的多(硬盘 < 内存 <缓存cache < CPU)。因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时,就可以直接从它的高速缓存中读取数据或向其写入数据了。当运算结束之后,再将高速缓存中的数据刷新到主存当中。
1.2、JMM的三大特性
JMM的三大特性:原子性、可见性、有序性。
1、原子性
一个或多个操作,要么全部执行,要么全部不执行(执行的过程中是不会被任何因素打断的)。
2、可见性
只要有一个线程对共享变量的值做了修改,其他线程都将马上收到通知,立即获得最新值。
3、有序性
有序性可以总结为:在本线程内观察,所有的操作都是有序的;而在一个线程内观察另一个线程,所有操作都是无序的。
Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行进入。
1.3、JMM八种操作
为了支持 JMM,Java 定义了8种原子操作,用来控制主存与工作内存之间的交互。
Read读取:作用于主内存,将共享变量从主内存传送到线程的工作内存中。
Load载入:作用于工作内存,把 read 读取的值放到工作内存中的副本变量中。
Store 存储:作用于工作内存,把工作内存中的变量传送到主内存中。
Write写入:作用于主内存,把从工作内存中 store 传送过来的值写到主内存的变量中。
Use使用:作用于工作内存,把工作内存的值传递给执行引擎,当虚拟机遇到一个需要使用这个变量的指令时,就会执行这个动作。
assign赋值:作用于工作内存,把执行引擎获取到的值赋值给工作内存中的变量,当虚拟机栈遇到给变量赋值的指令时,就执行此操作。
lock锁定:作用于主内存,把变量标记为线程独占状态。
unlock解锁:作用于主内存,它将释放独占状态。
二、JNI
1、JNI简介
JNI是Java Native Interface的缩写,是使用Java调用系统本地接口、及定制的C、C++语言的接口的方案,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针。使用JNI和算法进行交互,主要是为了提高算法的性能,最大化的利用机器硬件资源。
2、JNI DEMO
调用demo篇幅很长,这边就不写了,可以参考我在网上找到的Demo
三、SPI
1、SPI简介
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。SPI多用公共实现方案替换场景,典型的就是各类框架的使用。
2、SPI使用步骤
1、定义好接口
2、定义好接口的几种实现方案
3、然后需要在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名。
3、SpringBoot Start实现方案
1、引入jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
2、新建被扫描进spring的bean
@Configuration
public class SpringbootConfig {
@Bean("HelloService")
@ConditionalOnMissingBean
// 找不到HelloService bean的时候通过该方法,初始化bean
HelloService startService() {
return new HelloServiceImpl();
}
}
3、写好接口及实现类
@Configuration
public class SpringbootConfig {
@Bean("HelloService")
@ConditionalOnMissingBean
// 找不到HelloService bean的时候通过该方法,初始化bean
HelloService startService() {
return new HelloServiceImpl();
}
}
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("hello my name is AAA");
}
}
4、配置需要初始化bean的位置
在resource目录下新建META -INFO文件夹及spring.factories文件.并且指向实现配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.test.demo.SpringbootConfig
三、JDK
(Java Development Kit) Java开发工具包
四、JRE
(Java Runtime Environment) java运行时环境
五、JVM
(Java Virtual Machine) java虚拟机 JDK>JRE>JVM
六、JDBC
(Java DataBase Connectivity) Java数据库连接
七、DBCP
(DataBase Connection Pool) 数据库连接池
八、JDO
(Java Data Object) Java数据对象
九、JMS
(Java Message Services) Java消息服务
十、JMX
(Java Management Extension) Java管理扩展
十一、JTS
(Java Transaction Service) Java事务服务
十二、JCF
(Java Collections Framework) Java集合框架
十三、JSR
(Java Specification Requests) Java 规范请求
十四、JNDI
(Java Naming & Directory Interface) Java命名目录服务
十五、JMS
(Java Message Service) Java消息服务
十六、JTA
(Java Transaction API) Java事务服务
十七、JAF
(Java Action FrameWork) Java安全认证框架
十八、JAAS
(the Java Authentication and Authorization Service) Java认证授权服务
十九、RMI
(Remote Method Interface(Invocation)) 远程方法调用
二十、IDL
(Interface Definition Language) 接口定义语言
AWT (Abstract Windows TooleKit) 抽象窗口工具箱
URL (Uniform Resource Location) 统一资源定位符
HTTP (HyperText Transfer Protocol) 超文本传输协议
FTP (File Transfer Protocol) 文件传输协议
TCP/IP (Transmission Control Protocol/internet Protocol) 传输控制协议和互联网协议
SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议
LAN (Local Area Network) 局域网
DNS (Domain(领域) Name Service) 域名服务
ISP (Internet Service Provider) Internet 服务提供商
URI (Uniform Resource Identifier) 统一资源标识符
HTML (HyperText Markup Language) 超文本标记语言
HREF (Hypertext Reference) 超文本链接
CGLIB (Code Generation Library) 代码生成类库
SOAP (Simple Object Access Protocol) 简单对象访问协议
SOA (Service Oriented Architecture) 面向服务架构
WSDL (Web Service Description Language) Web服务描述语言
DWR (Direct Web Remoting) Java 远程Web调用
ORM (Object-Relation Mapping) 对象关系映射
BPM (Business Process Management) 业务流程管理
IDE (Integration Development Environment) 集成开发环境
POJO (Plain Old Java Object) 普通且古老的Java对象
VO (Value Object) 值对象
UDDI (Universal Description Discovery and Integration)
DAO (Database Access Object) 数据库访问对象
PI (Processing Instruction) 处理指令
WFC (Windows Foundation Classes for Java) 提供了支持面向Windows 操作系统的Java 软件包架构
WORA (Write Once,Run Anywhere) 一次编写,到处运行
DI (Dependency Injection) 依赖注入
DTD (Document Type Definition) 文档类型定义
STAX (Streaming API for XML)
CVS (Concurrent(同时的) Versions System) 版本控制器
SVN (Subversion)
SEO (Search Engine Optimization) 搜索引擎优化
SDO (Service Data Objects) 是一种针对在不同的数据源之间使用统一的数据编程模型的规范说明
OEM (Originality Equipment Manufacturer) 原始设备制造商
ERP (Enterprise Resource Planning) 企业资源计划
CRM (Customer Relationship Management) 客户关系管理