博客
分类
标签
归档
关于
博客
分类
标签
归档
关于
Tau的博客
文章
分类
标签
归档
关于
Java中的AQS
AbstractQueuedSynchronizer 简写AQS, 队列同步器,是用来构建锁或者其他同步组件的基础框架,Lock接口的实现,如ReentrantLock等都有它的身影,都是通过它来实现线程同步的。从名字可以看出,首先它是个同步器,其次它里面还有个队列。 AQS使用了模板方法模式,这意味着AQS类里面大体有两种方法:需要被子类重写的涉及到具体细节的方法和模板方法,而模板方法就...
2019-10-17
Java
Java
Read More
Java中的Lock
Lock是JUC包中的一个接口,是在synchronized关键字之后出现的,用来提供锁的功能,本文主要讨论Lock接口以及其实现类,以及为什么有了synchronized关键字了还要有Lock. synchronized作为内嵌的Java关键字,其可以隐式地获取和释放锁,它简化了同步的管理,同时也固化了锁的获取和释放,缺少灵活性。 在Java SE 5 之后,新增了Lock接口(以及相...
2019-10-16
Java
Java
Read More
Java中的final关键字
用法 修饰变量 修饰基本类型:基本类型的值不可被改变 修饰引用:引用的指向不能被改变 被final修饰的基本类型和String类型会在编译器被放到常量池 修饰方法 方法不可被覆盖 修饰类 类不可被继承 原理 我们反编译如下代码: 123456789public final class Tiger { private final String name ="tige...
2019-10-11
Java
Java
Read More
Java中new对象时到底发生了什么
Java中有许多创建对象的方式,比如使用new关键字,使用反射,使用序列化/反序列化,使用克隆,其内部原理也都不一样,本文主要讨论在使用new关键字创建对象的前前后后JVM都做了那些事。要讲清楚这个事情,需要了解一定的JVM内存模型,以及类加载机制。 ###缘起 首先要明白,创建对象这是一个运行期的动作,在运行期前面,还有一个编译期。编译期就是将我们写的java文件编译成class文件的过程...
2019-10-10
Java
Java
Read More
一次由继承引发的思考
本文主要讨论,我在考虑java种private修饰的属性和方法到底有没有被继承下来的一系列思考。 使用反射? 观察class文件? new一个对象时到底发生了啥? 创建一个对象常常需要经历如下几个过程:父类的类构造器() -> 子类的类构造器() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数。 先...
2019-10-10
Java
Java
Read More
HashMap中的hash方法
在HashMap,HashTable和ConcurrentHashMap中,hash()方法主要是拿来做定位,即通过对key进行散列,从而确定这个entry的存储位置。但是为了避免发生碰撞,java中的hash方法还是有许多细节操作的。 HashMap jdk 7 代码如下: 1234567891011121314final int hash(Object k) { ...
2019-10-08
Java
Java
Read More
HashMap中的容量
为什么建议初始化容量 真正的容量是多少 为什么是2的次幂
2019-10-08
Java
Java
Read More
Java中的fail fast
不知道到大家在操作Java集合类的时候有没有遇到过ConcurrentModificationException异常,反正我是遇到过,今天就来聊一下这个异常的缘起缘灭。 fail fast 上述异常都是由这个叫做fail fast的机制导致的,fail fast是Java集合类的一种异常检测机制,当多个线程并发修改一个集合类的结构时,就有可能触发上述异常。我们以ArrayList为例来探究一...
2019-09-29
Java
Java
Read More
Java中的类加载
本文主要讨论两个问题:何时类加载?如何类加载? 何为类加载 类加载时机 类加载的过程 序:java文件被编译成.class文件放在磁盘中 加载阶段: 根据类的全限定名将字节码加载到内存,加载到内存哪里呢?方法区! 可以认为,.class文件是类的静态结构,而加载阶段就是把这种静态结构编程动态的运行时结构 根据这个字节码生成一个java.lang.Class对象 我们讲过,万...
2019-09-24
Java
Java
Read More
Java中的volatile关键字
本文需要了解:Java内存模型 缓存一致性问题 为了提高CPU从内存中读写的速度,在CPU和和内存中间添加了缓存,有一级缓存,二级缓存,甚至三级缓存,从一级到三级,容量变大,速度变低。对于多个CPU场景,一般是每个CPU都有自己的一级和二级缓存而公用三级缓存。 在多CPU多线程的读写场景下,多个线程有可能会访问同一块内存区域,以写操作为例,多个线程都会把内存中的值读到自己的CPU中,然后修改...
2019-09-17
Java
Java
Read More
Previous
7 / 9
Next