java

6. jvm之集合

一. 结构图 Produces表示 二. Collection详解 1. 集合基本接口 Collection 通过上图可观察出Collection为所有集合的根接口,实际该接口仍然继承了一个接口Iterable,Iterable定义了创建迭代器(Iterator)的方法,因此所有集合(map接口并没有继承Collection接口)均可创建迭代器对象(详见迭代器设计模式)。该接口定义了一系列集合的基本公用方法如size(),add(),remove()等。 Iterator 迭代器接口,包含了hasNext(),next(),remove()三个方法,对数据存储对象(即集合)进行遍历,移除,使用迭代器可以在不关心数据存储细节的情况下,对存储数据进行遍历,

  • developer
18 min read
java

5. jvm之threadlocal

1. thread,threadlocal,threadlocalmap关系图 threadlocalmap相当于普通的map,以entry[key-value]数组的形式存储数据 threadlocalmap为threadlocal的内部类 thread中存在属性threadlocal.threadlocalmap,所以不同线程取到的threadlocalmap不同 用户对threadlocal的get及set操作,实际是对thread中属性threadlocalmap的操作,所以不同线程的get及set方法操作的对象不同 threadlocalmap保存数据以threadlocal实例为key,所以不同threadlocal即使在同一线程中调用get及set方法,操作的数据也不同 threadlocal只是将数据保存到不同的线程对象上,不同线程之间的数据存储了多份,但是如果保存的是对象类型数据,仍然是一个对象,修改对象属性时仍然会统一修改 总结: 一个Thread存在一个threadlocal.threadlocalmap变量,threadlocalmap中的key为threadlocal实例,value为欲保存的值 Threadlocal中存在get和set方法 set:以threadlocal实例为key,将要保存的值保存到threadlocalmap中 get:

  • developer
1 min read
java

4. jvm之native方法和JNI基础

一. 概述 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口。 二. native方法实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 三. JAVA本地方法适用的情况 1.为了使用底层的主机平台的某个特性,

  • developer
2 min read
java

3. jvm之==、equals()、hashCode()

一. 关于== ==是容易理解的。java设计java就是要比较两个对象是不是同一个对象。 对于引用变量而言,比较的时候两个引用变量引用的是不是同一个对象, 即比较的是两个引用中存储的对象地址是不是一样的。 并且和该对象的toString方法无关,即使重写类的toString方法,返回不同的值也不会影响该结果。 对于基本数据类型而言,比较的就是两个数据是不是相等。 二. 关于equals() 有时候当两个对象= =为false时,我们仍然会认为两者是“相等”的,比如对于String对象,当两个对象的字符串序列是一致的,我们就认为他们是“相等”的。对于这样的需求,需要equals()来实现。对于有这种需求的对象的类,重写其equals()方法便可。 Object中equals()的默认实现是比较两个对象是不是==,即其和=

  • developer
5 min read
java

2. jvm之classloader

一. classloader基础 1. 概念 程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。 每个class都有一个reference,指向自己的ClassLoader。Class.getClassLoader();array的ClassLoader就是其元素的ClassLoader,若是基本数据类型,则这个array没有ClassLoader 2. 获取classloader的方式 this.getClass.getClassLoader(); // 使用当前类的ClassLoader Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,

  • developer
16 min read
linux

VIM之基础命令

vim命令详解 VIM介绍 打开文件 关闭文件 移动光标(编辑模式) 翻屏 删除 复制命令 粘贴命令 修改 替换 撤消编辑操作 重复前一次编辑操作 可视化模式 查找 查找并替换 使用vim编辑多个文件 分屏显示一个文件 分窗口编辑多个文件 将当前文件中部分内容另存为另外一个文件 将另外一个文件的内容填充在当前文件中 跟shell交互 配置文件 设置 显示或取消显示行号 显示忽略或区分字符大小写 设定自动缩进 查找到的文本高亮显示或取消 语法高亮 vim 命令详解 介绍

  • linux
7 min read
java

设计模式培训文档

培训目的 清楚设计模式的应用场景 了解设计模式的结构 清楚相似设计模式的区别 答疑 设计模式原则 单一职责原则 一个类只负责一项职责 里氏替换原则 子类可以扩展父类的功能,但不能改变父类原有的功能。 依赖倒置原则 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 接口隔离原则 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 迪米特法则 一个对象应该对其他对象保持最少的了解。 开闭原则 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 设计模式划分 个人设计模式学习意见,未参考正规渠道 7个必须会,说到该设计模式就能想到结构图 8个清楚结构及作用 8个了解应用场景 七个必会的设计模式

  • developer
8 min read
mysql

数据库事务的四大特性

四大特性 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。 隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。 持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

  • mysql
1 min read
k8s

18. k8s之Admission Controller及webhook

k8s之webhook 什么是Admission Controller admission controller是k8s api的拦截器,将拦截到的请求进行过滤或修改处理 Admission webhook是啥 webhook就是一个HTTP回调,接收admission请求,处理并返回 用户可以定义两种webhook: validating admission webhook对应的k8s资源为ValidatingWebhookConfiguration;用于对请求进行验证,是否允许调用 mutating admission webhook对应的k8s 资源为MutatingWebhookConfiguration;用于对请求进行修改,如注入一个Sidecar。webhook回调,接收API Server发送的admissionReview请求,并返回 admissionResponse。 使用webhook有什么要求? kubernetes版本最低是v1.9 api

  • k8s
1 min read
docker

3. docker之容器隔离

Namespace-进程隔离 本来,每当我们在宿主机上运行了一个 /bin/sh 程序,操作系统都会给它分配一个进程编号,比如 PID=100。这个编号是进程的唯一标识,就像员工的工牌一样。所以 PID=100,可以粗略地理解为这个 /bin/sh 是我们公司里的第 100 号员工,而第 1 号员工就自然是比尔 · 盖茨这样统领全局的人物。 而现在,我们要通过 Docker 把这个 /bin/sh 程序运行在一个容器当中。这时候,

  • docker
25 min read