自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 单例模型的双重检查机制

单例模式:在内存中只能有一个实例,只能new一个对象。 首先我们先来看一个简单的例子: 上图单例代码中可能new的过程很耗时间和空间,可不可以使用它的时候再new。 下图代码解决了上面的问题: 但是上图代码如果在多线程访问它时,会得到不一样的结果,如果第一个线程来了,判断它不为空,第一个线程停止,第二个线程也来了,判断依然不为空,这时第一个线程恢复运行,这时两个线程都new这个对象,所以最后会new出不同的对象。 下图代码解决了上述问题。 但是这时锁太粗,会把这个方法里不需要加锁的业务逻

2020-06-03 16:02:24 443 1

原创 锁消除(lock eliminate)和锁粗化(lock coarsening)

锁消除(lock eliminate) StringBuffer是线程安全的,被synchronized修饰过的,是同步的。我们发现,sb这个引用只会在append方法中使用,不可能被其他线程引用(因为是局部变量,栈私有),因此,sb是不可能共享资源的,JVM会自动消除StringBuffer对象内部的锁。 锁粗化(lock coarsening) JVM会检测到这样一连串的操作都对同一个对象加锁(while循环内100次执行append,没有锁粗化得话就要执行100次加锁/解锁),此时JVM就会将加锁

2020-06-03 14:48:01 627

原创 Hashmap——put()源码分析(JDK1.8)

HashMap的Demo: 初始化插入第一个元素: put()方法:put的第一个参数hash(key)根据key值计算hash。 hash(key)方法:当key为空,返回0;key不为空,返回h为key的hashCode值,异或h右移16位。 扰动函数:为了保证hash的散列尽量均匀。(将高位和低位进行异或操作,让高位值的不同也能对低位的值产生影响) putVal()方法: //第一放数据,创建的Node类型的数组里是空,没有对象,newNode新建一个Node对象把tab[i]放进去。 .

2020-05-17 09:49:12 257

原创 为什么HashMap的容量是2的n次幂?

这是一个比较小的知识点,也是一个常见面试题。 首先我们要了解与(&)运算的执行速度比模(%)快很多,可以通过程序验证。 使用散列法计算时,因为2的n次幂减一的二进制每一位都是1,这时进行与(&)运算和进行模(%)运算结果是一样的(见下图),但使用&运算计算效率更高,因此容量是2的n次幂。 ...

2020-05-16 23:50:54 591

原创 初学JVM

JAVA如何实现跨平台? Java实现跨平台主要是通过JVM JVM在不同的平台有不同的版本,在不同的平台要安装不同的JVM版本,我们编写JAVA源码后,经过编译会生成字节码文件.class文件。 Java虚拟机JVM将.class文件翻译成不同平台对应的机器码,从而在不同的平台下运行 注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。 所以,运行Java程序必须有JVM的支持.

2020-05-15 10:39:02 115

原创 重载and重写

重载: 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。 被重载的方法必须改变参数列表(参数个数或类型不一样); 被重载的方法可以改变返回类型; 被重载的方法可以改变访问修饰符; 被重载的方法可以声明新的或更广的检查异常; 方法能够在同一个类中或者在一个子类中被重载。 无法以返回值类型作为重载函数的区分标准。 重写: 重写是子类对父类的允许访问的方法的

2020-05-13 21:45:12 103

原创 HashMap源码——参数值的含义

HashMap的初始容量:16 最大容量:2^30 加载因子:表示Hash表中元素的填满的程度,当超过0.75时,进行扩容 为什么是0.75?可以达到时间与空间的平衡 链表转为红黑树的阈值: 红黑树转为链表的阈值: 链表转为红黑树需要HashMap所有的节点数大于64: 链表转为红黑树的两个条件: 单表(头)的长度大于8。 HashMap所有的节点数大于64。 ...

2020-05-12 22:04:51 319

原创 Spring Boot中使用github账号授权登录——代码实现

图解登录流程 用户访问社区;点击登录;去github调用authorize(授权)地址;GitHub返回预先写好的redirect-uri地址并携带code;社区接到uri请求后解析出code,携带code去调用github的access_token接口;如果code正确会返回access_token;携带access_token去调用GitHub的user 接口;github返回user信息;存入数据,更新登陆状态;登陆成功。 实现过程 点击登录跳转到authorize地址,GitHub返回一个cod

2020-05-12 18:00:23 302

原创 Spring Boot中使用github账号授权登录——创建github Apps

创建github Apps 首先登录github点击Settings 点击Developer settings 创建一个新的OAuth Apps 根据提示填写以下必填项 生成Client ID和Client Secret

2020-05-11 21:01:27 181

原创 Java中的引用类型——强软弱虚

强引用 没有任何引用指向这个对象,垃圾回收器(gc)就把他回收。 软引用 运行结果: 在上述代码中,SoftReference是一个软引用,里面new了一个字节数组。 SoftReference表示对字节数组的引用是一个软引用 使用m.get()获得字节数组的内容。 堆内存最大20M,当分配的字节数组超过20M,之前的软引用的字节数组对象就会被回收。(上述代码中,刚才开始分配一个软引用的字节数组10M,后来分配一个15M的字节数组,超过20M就会把软引用的对象回收) 弱引用 垃圾回收器看到

2020-05-11 17:39:13 105

原创 锁升级的过程

(挡住的是1) 这些信息全部记录在markword的8个字节中。Markwork中记录了锁信息和GC信息。 升级过程 无锁态-偏向锁:第一个来的线程,只需要给锁贴一个标签(把markword的线程ID改成自己线程ID的过程:当前线程的指针),效率高。 偏向锁-轻量级锁(自旋锁,无锁,自适应自旋):又来了一个线程竞争时(只要有竞争时),将之前贴的标签撕掉(撤销偏向锁),在自己的线程栈生成Lock Record,两个线程采用自旋的方式(CAS)去修改指针,修改为指向自己线程栈的Lock Record指针。谁.

2020-05-09 21:11:22 157

原创 对象在内存中的内存布局

对象在内存中的内存布局 查看方法: 结果: 普通对象布局: markword(8字节); class pointer(类型指针)(经过压缩变成4字节,原来是64bit-8字节); instance data(实例数据); padding(对齐)。 对象头:markword和class pointer(12字节) 面试题 1.Object o = new Object()在内存中占了多少个字节? Java本身默认开启了compass压缩,所以Object占了16个字节(头12,对齐4)。 不压缩也是

2020-05-09 20:43:17 148

原创 CAS(compare and swap)的过程

CAS的过程图 读取当前值E,计算结果值V,将E和当前新值N作比较,如果相等,更新为V;如果不相等,再次读取当前值E计算结果V,将E再和新的当前值N比较,直到相等。 总的来说,CAS是在多线程访问时,保持线程一致性的改变某个值。 面试问题:ABA问题 什么是ABA问题:其他线程修改数次后的值和原值相同。 如何解决ABA问题:给当前值增加一个版本号,当其他线程对其改动时版本号修改,比较的时候不仅比较当前值还比较版本号。 CAS在JAVA的底层实现是通过指令 lock cmpxchg实现的。lock保证当

2020-05-09 20:20:55 125

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除