NIO-02 NIO和BIO的区别
模型BIO 和 NIO 的区别BIO 好比是通道传输,一来一回NIO 好比是管道传输,一堆来一堆回。
BIO 模型1234567________ _________| |-----------------------| || |-----------输入--------| || | | || |-----------输出--------| || |-----------------------| ||-------| |-------|
输入和输出都需要建立一条管道。也就是说,数据的传输是单向的,出去从输出流通道走,回来从输入流通道走。面向流,通道传输的是流
NIO 模型1234567_________ _________| |-----------------------| ...
NIO-01 概述
简述服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java NIO(Non-blocking / New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO 和 IO 的区别在于,IO 是面向流,NIO 是面向缓存。是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。
传统面向流的,单向的三个核心组件
Channels
Buffers
Selectors
1.Channels 负责传输白话: 就是数据传输用的通道。作用是打开到IO设备的连接,文件、套接字都行。绕绕话: 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
2.Buffers 负责存储缓冲区,用来存放具体要被传输的数据,比如文件、scoket 等。这里将 ...
spring boot 解决生产环境下多线程调用FTP流被关闭问题
前言在 spring boot 下把 FTP 工具类以类的型式注入到 spring 容器中。FTP 工具类在实际应用过程中,如果是单例的对象会出现问题:当线程 A 调用FTP工具时调用连接,线程B 同时调用FTP并使用完闭关闭流,这时A的连接会就被关闭了。
解决方案将 Bean 置为多例对象。这样当线程每次调用该 Bean 就会生成一个新对象,互相之间不影响。
12public class FtpUtil {}
12345678910111213@Configurationpublic class FtpUtilConfig { @Autowired private FtpProperties ftpProperties; @Bean @Scope("prototype") public FtpUtil ftpUtil () { FtpUtil ftpUtil = new FtpUtil(); return ftpUtil; }}
1234 ...
springboot中的@ConfigurationProperties注解的使用
ConfigurationProperties 注解的使用将配置文件中的配置,以属性的形式自动注入到 实体中。要特别说明的一个注属性ignoreUnknownFields = false这个超好用,自动检查配置文件中的属性是否存在,不存在则在启动时就报错。locations 这个注解属性,不知道为什么不可以使用。用来指定其他配置文件名。
1.application.properties 配置
12345#自动配置设置service.properties.name=my-test-nameservice.properties.ip=192.168.1.1service.user=kayleservice.port=8080
2.对应实体Properties 就是对应的配置文件中的 properties,注意也要给 get/set也就是说,配置文件中的前缀是什么, prefix 中就使用什么。成员变量就是对应的配置文件的第二级属性名。
12345678910111213141516171819202122232425262728293031323 ...
springboot @Import注解
简述Import注解在4.2之前只支持导入配置类在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean。在 spring boot 的配置类中的使用比较多。
测试@Import 的自动导入功能
1.一个配置类
123456@Configuration@Import(ImportDemo.class)public class ImportConfig {}
2.一个普通没有加任何注解的类
12345public class ImportDemo { public void doSomething () { System.out.println("ImportDemo.doSomething()"); }}
3.测试类
12345678910public class TestMain { public static void main(String[] args) { AnnotationConfigApplica ...
springboot03 非parent方式搭建
简述项目中通过maven集成 springboot 有两种方式:
继承parent 方式
非继承 parent 方式
上一篇文章已经介绍过通过直接继承springboot项目座标的方式继承,这次说明如何通过非直接继承的方式构建springboot项目。
非parent 方式推荐使用这种方式。这样就可以使子项目使用 parent 标签了。
这种方式也比较直观,这里需要两个项目进行搭建测试
parent 项目,需要被继承
childen 项目,即需要继承 parent 项目,又需要springboot项目座标构建项目。
parent 项目配置添加一个 spring boot 依赖,dependencyManagement 中的 springboot 就是核心,是springboot 官方提供的依赖,它是一组springboot的完整依赖座标,根据需要进行引用。type 是 pom,scope 是 import,这种类型的 dependency 只能在 dependencyManagement 标签中声明。
12345678910111213141516171819202122232 ...
springboot02-搭建parent方式
spring boot 的搭建相当简单,简化了大量的xml配置,只需要关键配置即可开箱使用。
搭建什么是 parent 方式?使用 pom.xml 中的 parent 标签。官方示例中,都是让我们继承一个 spring 的 spring-boot-starter-parent 这个parent就是:
123456789101112<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version></parent><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring ...
竞态条件 racing condition
前言多个线程读时,线程是安全的。当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。我的理解,竞态条件就是一种情况。
代码实现假设有 A、B 两个线程,调用 add 方法分别传入 1 和 2,理想条件下结果应该是 3。现在出现了不安全的情况,有可能结果不对。add方法就是临界区count 就是同一资源。
12345678public class Counter { protected long count = 0; // 临界区 public void add(long value) { // 被竞争的资源 this.count = this.count + value; } }
其实这样一看,说白了,就是要严格控制线程的执行顺序,假设是按A、B的顺序执行来讲,B依赖于A先执行完成,B再执行结果才是正确的,中间不能出现问题,否则如果,中间交叉执行,就有可能发生了竞态条件。
总结如果某个资源会被多个线程竞争,要保证安全性的情况下,可以加上一些必要的同步措施 ...
springboot01 概述
概述Spring Boot 是 Spring 社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。大多数Spring Boot项目只需要很少的配置文件。
Spring Boot特性
创建独立的Spring项目
直接嵌入Tomcat、Jetty或Undertow(不需要部署WAR文件)
提供有自动的 "启动器 "依赖,以简化你的构建配置
提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等
完全没有代码生成和xml配置文件
Spring Boot运行环境最低 Java6 官方推荐 Java8
内置 Servlet 容器Tomcat 7 8Jetty 8 9
Spring Boot 支持哪些应用普通 Java 项目和 web 项目
jstat统计JVM信息
重要参数是要看 FGC 执行了多少次。
JVM Statistics Monitoring Tool用于监控虚拟机各种运行状态信息的命令行工具,查看虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
统计垃圾回收堆的行为
jstat -gc pid
显示格式:
列说明
123456789101112131415S0C: survivor0区的总容量S1C: survivor1区的总容量S0U: survivor0区已使用的容量S1U: survivor1区已使用的容量EC: Eden区的总容量EU: Eden区已使用的容量OC: Old区的总容量OU: Old区已使用的容量PC: 当前perm的容量 (KB)PU: perm的使用 (KB)YGC: 新生代垃圾回收次数YGCT: 新生代垃圾回收时间FGC: 老年代垃圾回收次数FGCT: 老年代垃圾回收时间GCT: 垃圾回收总消耗时间
单位时间内显示次数
jstat -gc pid 秒 次数这个命令意思就是每隔2000ms输出gc情况,一共输出20次。