首页

来自智得网
跳转至: 导航、​ 搜索

精选文章

SPI【Java】查看全文
SPI是Java语言中的一种扩展机制。

面向的对象的设计里,基于接口编程是模块之间交互的标准方式,模块之间使用接口而不是特定的实现类可以更好的实现扩展型。在模块进行装配的时候才确定接口的真正类型。 为了避免模块装配时硬编码指定实现类,java spi提供了到接口实现的路由功能,将装配的控制权移到了程序之外,使用配置来进行实现。 SPI全称是 service provider interface,SPI的实现一般位于独立的 JAR 包,在程序调用时候,可以实现自动的路由。 在jdk6里面引进了新的特性ServiceLoader。ServiceLoader的主要作用是用来装载一系列的service provider。 ServiceLoader可以通过配置文件来装载指定的service provider。服务的提供者提供了服务接口的若干实现,只需要在jar包的META-INF/services/目录创建一个以服务接口命名的文件,文件配置了实现该服务接口的具体实现类。 外部程序装配模块的时候,通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 SLF4J SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个日志的抽象层( abstraction layer),该框架允许在实际使用的时候装配任意一个实现了抽象层的日志类库。 使用 SLF4J 的过程中上层应用只需要面向SLF4J接口编程,不需要关心具体的底层的日志框架,实现了上层应用和底层日志框架的解耦。

目前主流的日志框架例如log4j, logback都实现了…
Java 内存模型查看全文
Java的内存模型规定了Java程序中的变量和对象的访问方式。它定义了程序如何在内存中存储和共享变量和对象,以及线程间如何相互通信和同步。Java的内存模型旨在提供一个标准的内存模型,使得Java程序可以在不同的计算机平台上都能够正确运行。

Java的内存模型可以分为两部分:线程间共享的内存和线程私有的内存。 线程间共享的内存包括堆内存和方法区内存。堆内存用于存储对象实例和数组,而方法区内存用于存储类信息、静态变量和常量池等。 线程私有的内存包括程序计数器、虚拟机栈和本地方法栈。程序计数器用于记录当前线程执行的位置,虚拟机栈和本地方法栈用于存储方法的参数、局部变量和方法调用栈等信息。 Java内存模型使用线程同步来保证共享变量的可见性和有序性。它定义了一些同步原语,如synchronized和volatile,用于确保多个线程之间的同步和协调。这些同步原语能够保证线程在共享内存中读写变量时的可见性和有序性,并避免竞态条件等线程安全问题。

Java的内存模型的设计是为了保证程序的正确性和可移植性。它提供了一种标准的内存模型,使得Java程序在不同的平台上都可以运行,并且保证多线程程序的正确性。对于开发者来说,了解Java的内存模型对于编写高效且正确的多线程程序至关重要。
GMP查看全文
Golang的GMP模型.png
GMP是Golang语言协程调度机制的模型。

协程机制是对传统的多线程/进程机制的一种改良,虽然多进程/线程可以有效提升系统的并发能力,但是互联网等高并发场景下,需要并发处理的请求量级较大,每个请求创建一个线程会带来大量的内存等资源的消耗。 而且进程/线程切换的成本较高,对CPU产生了较大的浪费。 golang的语言的协程机制通过实现用户态线程(协程)的方式减少线程的资源消耗以及切换消耗,用户态线程在执行的时候动态绑定到系统线程上。 无论是多线程、多进程、多协程都涉及到多个任务的并发执行,而且任务数量往往多于CPU的核数,所以就有了任务调度的需求,当进程阻塞在IO、时间占用较长等场景下需要切换其他等待执行的进程。 在早期单进程时代是不需要调度器的,因为进程是串行执行的。 GMP是协程的调度机制,G代表的是go语言中的协程,M代表的是实际的线程,P代表的是Go的逻辑处理器。 协程通过调度器和系统线程进行绑定之后,才能真正执行代码逻辑,协程和线程的绑定关系可以分为1 : 1,N:1,M:N等几种模型。在Golang语言中G和P是多对一的关系,而P和M是一对一的关系。 G和P,以及P和M之间的关联关系不是固定的,例如P在运行过程中被销毁,之前绑定的G就会转移到其他的P上执行。 数据存储 调度机制意味着不是所有的任务都可以得到立即执行,而不能被执行包括被切换的协程需要有存储的机制。等待被调度执行的协程存储在运行队列,Golang的调度器把队列分为局部运行队列和全局运行队列,每个和P绑定一个长度为256的循环队列,每次把G放入该队列的时候从末尾插入,获取的时候从头部获取。

除了从本地队列获取执行线程外,P还有一个特殊的字段runnext可以标识下一个要执行的协程…

热门分类

算法题库

精选内容