Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。 下面是本文所涉及到的主题列表: 为什么使用Selector? Selector的创建 向Selector注册通道 SelectionKey 通过Selector选择通道 wakeUp() close(
1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多线程情况下,如果需要修改“共享同一个缓存行的变量”,就会无意中影响彼此的性能,这就是伪共享(False Sharing)。 2. 缓存行 由于共享变量在 CPU 缓存中的存储是以缓存行为单位,一个缓存行可以存储多个变量(存
1 ASCII American Standard Code for Information Interchange。最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单。 结构 ASCII表是单字节字符表,此表中一个(英文)字符用一个字节表示 在ASCII中从00000000(第0个)~00011111(第31个)前32被用来作为控制字符表示各种类似:响铃、退格、换页
如果在加载类时内存不足,则它可能会静默失败,从而在数据库中留下无效的类。 稍后,如果您尝试调用或解析任何无效的类,则将在运行时引发ClassNotFoundException或NoClassDefFoundException实例。 如果要加载损坏的类文件,将会得到相同的例外。 您应该执行以下操作:验证该类实际上是否包含在您要加载到服务器的集合中使用loadjava -force选项来强制要加...
分层的目的,就是保证复用和相对稳定性! 开局一张图,后文全靠编 VO值对象(Value Object) new关键字创建,由GC回收。VO是值对象,精确点来说,它是业务对象,存活在业务层,由业务逻辑使用,其存活目的就是给数据提供一个生存地。 主要对应界面显示的数据对象。对于一个WEB页面,用一个VO对象对应整个界面的值。 VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应
@RunWith 当一个类用@RunWith注释或继承一个用@RunWith注释的类时,JUnit将调用它所引用的类来运行该类中的测试而不是开发者去在junit内部去构建它。我们在开发过程中使用这个特性。 @SpringBootTest 配置文件属性的读取 可以在运行SpringBoot为基础的测试类上指定的注释。在常规Spring TestContext框架之上和之上提供以下特性: 当定义没有
org.apache.ibatis.annotations包下有着 mybatis 所有的注解,让我们一文打尽! 1 @Mapper MyBatis映射器的标记接口 从mybatis3.4.0开始加入了@Mapper注解,目的就是为了不再写mapper映射文件但是源码中并没有对于这个注解的详细解释 添加了@Mapper注解之后这个接口在编译时会生成相应的实现类 需要注意的是:这个接口中不可以定义
添加测试类 Maven依赖自动刷新 自动导包
MBG全部指代MyBatis Generator: MyBatis Generator 1.3.4 扩展,可以设置 Mapper(Dao)后缀 运行MyBatis Generator 有4种运行MBG的方法,具体请看文档 运行 MyBatis Generator MBG下载地址:http://repo1.maven.org/maven2/org/mybatis/generator/mybatis
生成器设计思路: 连接数据库 -> 获取表结构 -> 生成文件 1 下载与安装 官网文档入口 最方便的 maven 插件使用方式 贴至pom 文件 2 新建配置文件 填充配置信息(官网示例) 项目实例 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUB
该插件主要是在mapper接口方法和mapper XML文件之间来回切换非常方便,极大的提高了开发效率 我们知道,mapper 接口一般会定义很多数据层从操作 API,如果没有映射,一个个去 xml 文件中寻找对应 sql 语句,无异于大海捞针,效率奇低!赶紧让我们把三剑客之一用起来! 在IDEA的设置中搜索 Plugins - free Mybatis Plugin 作用 详细参见https:
下载了最新的JUnit版本,是4.13,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误, 一般的解决方案是,换一个低一点的版本就好了 还有人说,是缺少hamcrest的包。去官网又看了一下,结果发现这样一段话: junit.jar: Includes the Hamcrest classes.
一方:(一方包,一方库),一般指的是本项目或者本工程中的类和方法、接口等。二方:(二方包,二方库),一般指的是公司内部的依赖库,公司内部其他项目发布的jar包,如公司项目平台的核心依赖包。三方:(三方包,三方库),一般指的是外部的开源库或开源项目贡献的jar, 比如apache、google、Ali等发布的依赖
1 简介 一个线程集合。是为了更方便地管理线程。父子结构的,一个线程组可以集成其他线程组,同时也可以拥有其他子线程组。 从结构上看,线程组是一个树形结构,每个线程都隶属于一个线程组,线程组又有父线程组,根线程组——System线程组。 2 线程组树的结构 JVM创建的system线程组是用来处理JVM的系统任务的线程组,例如对象的销毁等 system线程组的直接子线程组是main线程组,这个线程
JDK 6 时提供。一种同步器,可以由一个线程独占。该类提供了创建锁和相关同步器的基础,这些同步器可能包含所有权的概念。AbstractOwnableSynchronizer类本身并不管理或使用这些信息。但是,子类和工具可以使用适当维护的值来帮助控制和监视访问并提供诊断。 public abstract class AbstractOwnableSynchronizer implemen
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入 quit 命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java 没有提供一种安全直接的方法来停止某个线程,但是 Java 提供了中断机制。 如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。中断机制是如何工作的?捕获或检测到中断后,是
结合本人最近经常翻译 JDK 官方文档,特此整理翻译意见. 文档翻译规范 专有名词保持大写:HTML, HAML, SASS, REST…等等 约定翻译的名词 原文 中文 application 应用程序、应用 array 数组 attribute 属性 class 类别 code 代码 collection 集合 command-line 命令行 database 数据库 (database)
0 前言 全是干货的技术殿堂 P5 校招 springboot或者spring的加载流程对IOC和AOP的理解jdk和cglib实现的AOP实际上会在内存生成动态代理对象,还有什么其他办法实现AOP?经提示答出AspectJ以及实现原理Spring中的对象的作用域Singleton对象引用Prototype会发生什么项目中怎样使用微服务?两个服务之间调用的流程rpc与http的区别设计rpc协议
最近正是求职热季,群友也提了很多问题,特地来总结下 1 学历重要吗? 废话!硕士都满地跑了,本科生更要努力提高自己技术实力才能进好公司!优秀的人一直很优秀,自己欠的也都是要还的!谁再说读书无用论,建议先转行收租。 当然了,本科绝对可以工作了,但是考虑到这行业 35 中年危机,到时可能考虑公务员或者国企、大学教师等,此时研究生等高学历优势就凸显了。所以建议尽量读个 211 研究生(注意是 211
1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerF
0 前言 全是干货的技术殿堂 下载、解压并编译 cd redis-2.8.0 make ##编译好的二进制文件在src目录里。运行Redis cd src 启动占用窗口启动在后台,不占用窗口 ##你可以使用内置的客户端与Redis互动: $ src/redis-cli redis> set foo bar OK redis> get foo "bar" Redis单实例配置
0 前言 全是干货的技术殿堂 this 是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。 教科书般的解释,字都认识,怎么连在一起还是不知道啥意思呢? 1 this的值究竟是什么呢? 函数的不同场合,this有不同值。 总的来说,this就是函数运行时所在的环境对象。 1.1 简单函数调用 函数的最通常用法,属全局性调用,因此this就代表全局对象。 看下面案例 1.2 作为对
0 前言 全是干货的技术殿堂 非严格相等比较 (==) 严格相等比较 (===): 用于 Array.prototype.indexOf, Array.prototype.lastIndexOf, 和 case-matching 同值零: 用于 %TypedArray% 和 ArrayBuffer 构造函数、以及Map和Set操作, 并将用于 ES2016/ES7 中的String.protot
0 前言 全是干货的技术殿堂 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类型值,因为集合只接收对象。通常这种情况下你的做法是,
1 为什么要用线程池 1.1 线程the more, the better? 1、线程在java中是一个对象,更是操作系统的资源,线程创建、销毁都需要时间。如果创建时间+销毁时间>执行任务时间就很不合算。2、Java对象占用堆内存,操作系统线程占用系统内存,根据JVM规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。3、操作系统需要频繁切换线
对于系统地介绍Java问题定位类的教程少之又少,即使有这方面的内容,往往也是一笔带过。本教程系统地介绍Java问题定位技术,我相信有一些很少公开的定位技术,在正确使用时,可以产生令人惊讶的效果。 采用Java开发的大型应用系统越来越大、越来越复杂;很多系统甚至是将很多第三方系统 集成在一起,整个系统看起来像一个黑盒子。系统运行遭遇问题(系统停止响应,运行越来越 慢,或者性能低下,甚至系统core
在JDK的源码使用工厂模式,ThreadFactory就是其中一种。 在我们一般的使用中,创建一个线程,通常有两种方式:继承Thread类,覆盖run方法,实现我们需要的业务继承Runnable接口,实现run方法,实现我们需要的业务,并且调用new Thread(Runnable)方法,将其包装为一个线程执行 设想这样一种场景,我们需要一个线程池,并且对于线程池中的线程对象,赋予统一的线程优先
假如说你想复制一个简单变量。很简单: int apples = 5; int pears = apples; 基本数据类型都适用。 但是如果你复制的是一个对象,情况就有些复杂了。 假设说我是一个beginner,我会这样写: class Student { private int number; public int getNumber() { r
0 前言 全是干货的技术殿堂 文章收录在我的 GitHub 仓库,欢迎Star/fork: Java-Interview-Tutorial https://github.com/Wasabi1234/Java-Interview-Tutorial jacoco是一个开源的覆盖率工具,通过插桩方式来记录代码执行轨迹. ant是构建工具,内置任务和可选任务组成的.Ant运行时需要一个XML文件(
JDK包含许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号