- 博客(66)
- 收藏
- 关注
原创 实探java对象的内存布局
实探java对象的内存布局在我深入学习synchronized的时候,我查了很多资料,发现synchronized锁住的是对象的对象头,然后我又了解什么是对象头,这块的资料就很多了。总结一下就是:在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充数据。对象头:对象头主要结构是由Mark Word 和 Class Metadata Address实例数据:存放类的属性...
2019-12-19 12:33:03
870
原创 K8S在kubeadm init以后查询kubeadm join
K8S在kubeadm init以后查询kubeadm join我们知道在执行kubeadm init命令以后,会生成让节点加入集群的命令但是我们在当时如果没记下这个命令,可能后续加节点的时候就忘记了这个命令,此时需要执行如下命令即可kubeadm token create --print-join-command...
2019-12-16 15:17:43
8351
原创 K8S更改kubeadm的版本
K8S更改kubeadm的版本我当前的kubeadm版本是1.17.0我想把版本换成1.14.0首先列出已经安装过的kubeadm的包yum list installed | grep kube卸载安装的kubeadm包yum remove kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 -y安装我们需要的1.14.0的版本...
2019-12-16 14:57:24
2760
原创 k8s简介以及linux环境下的详细安装步骤
k8s简介以及linux环境下的详细安装步骤k8s是Kubernetes的简称,Kubernetes中间有8个单词,所以叫k8s,就是这么简单粗暴。我们可以看到docker的图标是鲨鱼,k8s的图标是舵盘,是个领航员,代表着一个k8s引领着一群鲨鱼。我们知道docker是容器,不知道的可以先学学docker再学习k8s,这里K8S的作用就是管理容器。当我们的应用中有很多容器的时候,是不需要去维...
2019-12-12 18:19:43
6587
2
原创 并发编程必会之-Lock
并发编程必会之-Lock并发编程中,synchronized关键字是隐式的加锁和释放锁。JVM层面实现的Lock是显示的加锁和释放锁。代码层面实现的代码层面的实现大量使用了CAS,如果对CAS不了解的,可以看我的另一篇博客并发编程必会之-CAS下面是锁的最简单使用 Lock lock = new ReentrantLock(); try { ...
2019-12-04 12:00:59
257
原创 并发编程必会之-CAS
并发编程必会之-CAS前言多线程面试必问之synchronized在我的这篇文章里详细讲解了并发编程的鼻祖型大佬synchronized。synchronized是在jvm层面实现的加锁,保证的并发。CAS是在代码层面实现的逻辑加锁,保证的并发。为什么是逻辑加锁,因为它实际上是没有进行加锁操作的。我们把并发代码块比喻成一个房子,只能有一个线程进入到这个房子里面。synchronize...
2019-12-02 17:05:44
203
原创 多线程面试必问之synchronized
多线程面试必问之synchronizedsynchronized对于我们java程序员来说简直不要太熟悉,但是熟悉还不行,往往面试官还喜欢拿这个开撕,不准备点儿东西还真是不一定对付的了他。synchronized都用在哪儿?修饰静态方法 锁对象是类对象修饰普通方法 锁对象是当前实例对象修饰代码块 锁对象是括号里面的对象public class demo2 { //锁对象是de...
2019-11-29 11:10:54
195
原创 谈谈java中的volatile
谈谈java中的volatilevolatile是面试官常问的一个知识点,不过咱们把volatile全面了解一点儿,不管他怎么问,也能答出来,即使不是太完美,但是也避免了只知皮毛的尴尬!下面一步步的讲解一下。计算机内存模型是什么?主内存:数据存储的区域cpu:电脑的大脑,运行速度贼鸡儿快,快就快吧,而且发展还贼鸡儿快,什么I7,I9,8线程,16线程的,越来越快,这研发速度甩了内存,硬盘好...
2019-11-25 16:23:23
222
原创 三个线程交替打印 0-100
三个线程交替打印 0-20利用java里面的Condition来实现public class ThreadTest2 { static volatile int a = 0; public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition co...
2019-11-21 17:01:37
602
2
原创 sleep和wait的区别
sleep和wait的区别我们先一个一个看,看完自然就知道他们之间的区别了sleepsleep是Thread类里面的native方法,作用是让当前执行的线程休眠指定的毫秒数。public static native void sleep(long millis) throws InterruptedException;当参数millis小于0时,抛出异常java.lang.Illeg...
2019-11-21 16:41:03
247
1
原创 三个线程T1,T2,T3。如何让T2在T1后执行,T3在T2后执行?
三个线程T1,T2,T3。如何让T2在T1后执行,T3在T2后执行?答:使用线程的join可以使线程之间进行互相等待package com.tk.riskanalysis;/** * @author wkw * @date 2019/10/23 10:06 */public class demo1 { public static void main(String[] ar...
2019-11-21 14:33:15
576
原创 java用数组实现环形队列
java用数组实现环形队列队列的特点是先进先出,用数组实现的时候,如果不是环形数组,那么每次取出第一个元素的时候,都需要将数组的所有元素向左移动一位,这样子很是浪费性能,所以可以通过环形数组,利用下标来实现队列,这样从队列中取数据的时候就不需要操纵数组移动每个元素了。package com.kw;/** * 环形数组实现队列 * 队列的最大有效值为 队列的长度-1 * 队列的头和尾初...
2019-08-12 22:26:37
475
原创 java中二维数组和稀疏数组互转
java中二维数组和稀疏数组互转在某些应用场景中需要大量的二维数组来进行数据存储,但是二维数组中却有着大量的无用的位置占据着内存空间,稀疏数组就是为了优化二维数组,节省内存空间。下面就是二维数组转稀疏数组的图例。稀疏数组中将二维数组没有意义的0全部干掉,稀疏数组中第一行记录着二维数组的行列和总共有几个值第二行开始就记录着每个每个二维数组中的值的行列以及数值比如下图中的11是第二行第二列...
2019-08-11 22:42:33
255
原创 SpringBoot利用Aop打印入参出参日志
SpringBoot利用Aop打印入参出参日志前言以前写代码不会用Aop的时候,记录入参出参的日志打印都是在Controller中完成的,每个Controller的方法开始之前先打印个日志,然后方法返回之前再打印一行日志,虽然以前也感觉到这个代码比较冗余,也知道Aop可以实现日志打印,但是思维固话了,也习惯了,也就得过且过了。直到接到上任同事留下的项目,日志没有对入参出参做统一的打印,线上出...
2019-08-08 10:19:54
7028
2
原创 java实现XML转JSON
java实现XML转JSON首先引入依赖 <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180813</versi...
2019-08-08 09:57:26
690
原创 SpringBoot中配置拦截器时,跨域失效
SpringBoot中配置拦截器时,跨域失效前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求。@Configurationpublic class MyWebAppConfigurer extends WebMvcConfigurerAdapter { static final String...
2019-07-17 17:55:44
4136
5
原创 在response的header里面添加token,前端获取不到
在response的header里面添加token,前端获取不到在写登录功能的时候,前端如何都获取不到token的信息 public ResultInfo login(HttpServletResponse response, HttpServletRequest request, @RequestBody Map<String, String> param) { ...
2019-07-16 17:39:04
13794
8
原创 在用java9使用jwt的时候出现的问题
在用java9使用jwt的时候出现的问题Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.encode(Base64Codec.java:21) at io.jsonwebtoken.im...
2019-07-16 13:59:39
1158
原创 springboot整合mysql连接报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized..问题解决
springboot在项目里面整合mysql的时候报错java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver ...
2019-07-05 11:27:54
168
原创 第50 条:必要时进行保护性拷贝
必要时进行保护性拷贝核心思想不可变类可以轻易的被外部对象改变,所以在必要时要进行保护性拷贝。比如下面的类,可以生成一个不可变类,因为他的域都是final的,但是外部可以通过将传递进来的引用进行改变,实则就会改变这个不可变类,可能导致错误的发生。public class C { private final Date start; private final Date end...
2019-05-24 10:43:10
154
原创 第26 条: 请不要使用原生态类型
泛型请不要使用原生态类型泛型是java1.5引进来的,什么是泛型我就不多说了。什么是原生态类型:这是原生态的,没有<>List list = new ArrayList<>();这是非原生态的,即有<>List<String> list = new ArrayList<>();泛型的作用有两点1.编译时检查我们所放入的...
2019-05-22 16:43:16
312
原创 第22 条:接口只用于定义类型
接口只用于定义类型喂,说的就是你,在接口里面定义常量的行为,常量是类的实现细节,这样不仅把实现细节泄露出去,哪天不用这些常量了为了二进制兼容性还不得不维护这个接口,大大的污染了类的命名空间简而言之,接口应该只被用来定义类型, 它们不应该被用来导出常量。...
2019-05-22 14:50:30
241
原创 第21 条: 为后代设计接口
为后代设计接口java8之前,为接口添加一个方法,还得去破坏所有的子类代码才可以,因为你接口添加了方法,子类得去实现这个方法,不实现就会编译不通过,但是在java8之后增加了缺省方法,可以在接口中添加方法了。比如有接口B,有a,b两个方法public interface B { public abstract void a(); public void b();}类C实...
2019-05-22 13:39:48
335
原创 第20 条:接口优于抽象类
接口优于抽象类定义:接口:没有方法实现(当然jdk1.8新加的default不算)抽象类:可以有方法实现区别:接口:允许多实现抽象类:只能单根继承优缺点接口不会改变类的层级,抽象类会改变类的层级。如何理解,比如抽象类People有三个子类,学生,老师和父亲,他们是一个层级的,都是people的子类。、现在我们又有个抽象类audit只需要teacher和father类来继承,而...
2019-05-22 13:25:52
187
原创 第19 条:要么设计继承并提供文档说明,要么禁止继承
要么设计继承并提供文档说明,要么禁止继承该类的文档必须精确地描述覆盖每个方法所带来的影响对于非私有方法包括构造器的文档说明上必须标注这个方法调用了哪些可以被覆盖的类,是什么顺序调用的,调用结果是怎么影响后续方法处理的。可以被覆盖的类是指非final的、公有的、受保护的方法,后台线程或者静态初始化器可能会调用可被覆盖的方法。调用的方法的文档末尾会有调用描述信息,写着: “ Implementa...
2019-05-22 10:25:07
205
原创 第18 条:复合优先于继承
复合优先于继承核心:对于专门为了继承而设计并且具有很好的文档说明的类来说,使用继承是非常安全的。然而,对普通的具体类进行跨越包边界的继承,则是非常危险的。论证与方法不同的是,继承打破了封装性咋的理解了?看如下的例子public class A { //方法功能是说话 public void say() { //一堆说话的实现细节 } //...
2019-05-20 15:27:49
262
原创 第17 条:使可变性最小化
使可变性最小化核心思想能把类做成不可变的就做成不可变的,比如String,Integer,Long等即使不能做成不可变的,也要尽可能的使类的成员变量变成private final的。优点1.不可变对象比较简单。不可变对象可以只有一种状态,即被创建时的状态。2.不可变对象本质上是线程安全的,并发状态下不用额外考虑他们。当多个线程并发访问这样的对象时,它们不会遭到破坏。3.不可变对象可以...
2019-05-17 17:40:12
195
原创 第16 条:要在公有类而非公有域中使用访问方法
要在公有类而非公有域中使用访问方法核心意思就是:访问成员变量要用setter和getter方法。为啥子咧?下面是在User类中要对属性age进行赋值,一顿赋值我想让你的年龄是多少岁都行,这有点儿不科学啊。 class User { public int age; public static void main(String[] args) { new...
2019-05-17 16:06:22
265
原创 第15 条:使类和成员的可访问性最小化
第15 条:使类和成员的可访问性最小化核心思想就是封装,对外只暴漏接口,隐藏具体实现。尽可能使每个类或者成员不被外界访问到。对类而言:访问修饰符只有两种 //没有访问修饰符,默认就是包级私有类,只有同包类可以调用 class User { } //pulic修饰,类在哪儿都可以调用 public class User { }如果一个类只是在同包的其他类...
2019-05-17 11:24:15
248
原创 第14 条:考虑实现Comparable 接口
考虑实现Comparable接口实现这个接口的类就可以比较大小,比如你想对集合中的对象进行排序,那总得知道排序规则吧,这个接口就是定义排序规则的。下面是Comparable接口,里面只有一个compareTo方法package java.lang;import java.util.*;public interface Comparable<T> { public ...
2019-05-17 10:47:24
219
原创 第13 条: 谨慎地覆盖clone
第13 条: 谨慎地覆盖clone1.一个类要想实现clone,就要实现Cloneable接口,否则抛出异常2.Cloneable接口的功能就是为了改变Object类中clone方法以返回对象的clone值,这种接口用法不推荐。3.不可变类不能提供clone方法。4.clone是浅拷贝,概念参考我的另一篇文章clone深浅拷贝,往往clone出来的对象里面的成员变量和原始的是一个引用,原始...
2019-05-17 10:20:02
169
原创 第12 条:始终要覆盖toString
始终要覆盖toString这个这是建议,覆盖不覆盖对程序本身的运行是不产生影响的,它只是由于在调试的时候更想看到的是覆盖后输出的对象有用的信息。public class User { private String name; private int age; private String address; public User(String name, in...
2019-05-16 16:58:18
153
原创 覆盖equals时总要覆盖hashCode
覆盖equals时总要覆盖hashCode基于散列的集合例如HashSet,HashMap在判断是否是同一个对象的时候是先判断他们的hashCode是否相等,如果相等再判断equals是否相等,都相等两个对象才相等,而如果hashCode不相等就说明两个对象不相等,没有必要比较equals了。下面是来自Object的规范:1.在应用程序的执行期间,只要对象的equals 方法的比较操作所用到...
2019-05-16 16:43:54
284
原创 第十条:覆盖equals时请遵守通用约定
覆盖equals时请遵守通用约定我们应该知道,equals方法是Object的方法,是用的==比较,即比较是否是同一个对象 public boolean equals(Object obj) { return (this == obj); }但是大多数情况下我们要的不是对象相等即为相等,而是逻辑上的相等,常见的比如String类型的,只要字符相等我们就认为他们...
2019-05-16 16:08:05
155
原创 第9 条: try-with-resources 优先于try-finally
try-with-resources 优先于try-finally我们一般在关闭资源的时候都会选用try-finally,比如关闭各种读写流,数据库连接对象等,都会在finally中调用对象的close方法,即使发生异常也会确保资源被释放,这看上去没有什么问题。但是再添加另一个资源,就会显的乱七八糟的感觉,如下是文件拷贝代码示例。 public static void copy(Str...
2019-05-16 15:21:20
436
原创 第八条:避免使用终结方法和清除方法
避免使用终结方法和清除方法finalizer清除方法我想大家在java面试的时候早就是司空见惯了,在java9中用cleaner代替了finalizer,虽然标题是禁止使用这个方法,但是我认为即使推荐你用,也没有几个人会用的,我只是面试的时候看看这个东西是啥就行了,想让我用,那不可能。使用这个方法也就是标记让清除对象而已,但是这个方法的运行往往是不可预测,效率低下的,有可能会发生奇怪的现象,所...
2019-05-16 14:25:31
321
原创 第七条:消除过期的对象引用
消除过期的对象引用java虽然有垃圾回收器,但是不是说在任何情况下都不用考虑内存泄露的问题了。下面例子是一个简单的栈,包括入栈出栈。public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY...
2019-05-16 14:07:25
143
原创 避免创建不必要的对象
避免创建不必要的对象核心思想就是,能用一个实例就不要创建两个实例。这种情况一般是用在重量级的对象上面,比如JDBC连接池,创建一个数据库连接对象是非常损耗性能的一个操作,而且有的数据库对于连接上限也是有限制的,所以为了避免每次连接数据库的时候都要重新创建一个对象,就要维护一个数据库连接池,每次进行连接的时候不是创建新对象,而是重用连接池里面的对象。又比如String类型的,当我们用new S...
2019-05-15 17:01:33
99
原创 优先考虑依赖注人来引用资源
优先考虑依赖注人来引用资源有许多类需要依赖底层资源,比如我们有个类需要依赖底层的字典资源,像下面这样做成静态域的,或者把类做成Singleton的都是很常见的。public class Word { private static final Dictionary DICTIONARY = new Dictionary();}但是这只是作为有一本字典的情况下,当我们在不同的情况下需...
2019-05-15 16:45:12
427
原创 通过私有构造器强化不可实例化的能力
通过私有构造器强化不可实例化的能力比如下面的Math类,它只包含静态域和静态方法,这个类的用法就是直接就是用类名点调用方法。这种类大部分是作为工具类来使用,所以实例化这种类是没有任何意义的,为了防止这种类被实例化,通过设置它们的构造器为私有来阻住他们实例化。并且这种类是不能有子类的。因为所有的子类都显式或者隐式的调用了超类的构造器。package java.lang;import ja...
2019-05-15 16:12:48
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人