Synchronized 在1.5以前是重量级锁,当遇到synchronzed时,其他线程需要等待并进入blocked状态。 在1.6以后,经过大量的测试发现加锁的地方经常被一个线程访问。所以对synchronized进行了锁的粒度优化,主要在对象头增加标记位因此有了偏向锁、轻量级锁、重量级锁。 三种常用用法Synchronized(A.class), synchronized(变量) synchronized method, 通过代码与bytecode对比发现, synchronized method: 字节码中存在ACC_SYNCHRONIZED这个标记,当执行到这个行是,当前线程需要获取对象monitor锁,然后在进入方法处理...

Java 基础技能 包括以下大致内容 Object类的常用方法 常用反射方法 常用字段处理 枚举处理 泛型的获取 基本类型的判断 1. isAssignableFrom()与instanceof isAssignableFrom() 描述:判断目标类是否为父类的子类 使用:父类.class.isAssignableFrom(子类.class) instanceof 描述:判断实例是否为父类的子类 描述:(new)实例 instanceof 父类 具体的demo如下 1package cn.linuxcrypt.api.demo; 2 3import lombok.Data; 4import org.junit.Test; 5...

一、Java基础类型 名字 默认值 占用空间 最大值 最小值 byte 0 8位 127(2^7-1) -128(-2^7) chat ‘u0000’ 16 位 Unicode 字符 \uffff (65535) \u0000 (0) boolean false 1位 - - short 0 16位 32767(2^15 - 1) -32768(-2^15) int 0 32 位 2,147,483,647(2^31 - 1) -2,147,483,648(-2^31) float 0.0f 32位 - - long 0L 64 位 9,223,372,036,854,775,807(2^63 -1)...

调用时机 clinit在jvm第一次加载class时调用,init在实例创建出来的时候调用 clinit在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行 init在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。 详情 clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺...

Java的内存优化之Reference,SoftReference、WeakReference、StrongReference 引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用、弱引用与虚引用,三种级别也各有所不同(软引用>弱引用)。本文浅析下软引用与弱引用。大概的解释,软引用适合应用在需要cache的场景,一般面向实现内存敏感的缓存;弱引用则是适用在某些场景为了无法防止被回收的规范性映射,它优先级最低,一般与引用队列联合使用。 详情 强引用(默认存在) 强引用,是在实际开发中最为普遍的引用。有时候你开发的时候,申请一个内存空间的时候,就已经是强引用了。例如: 1Object obj = new...

概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者 ArrayDeque实现了Deque的接口以及上图其他的接口,因此ArrayDeque支持序列化、克隆、迭代器操作、队列特性并且扩展了AbstractCollection抽象类 应用场景 linkedList内部实现用node节点链接前后元素。模拟c/c++的链表(长处在于中间节点的增删操作为o(1))。 vector方法加...

Java 8中的常用函数式接口 函数式接口 函数描述符 原始类型特化 Predicate T->boolean IntPredicate, LongPredicate, DoublePredicate Consumer T->void IntConsumer,LongConsumer, DoubleConsumer Function<T,R> T->R IntFunction, IntToDoubleFunction, IntToLongFunction, LongFunction, LongToDoubleFunction, LongToIntFunction, DoubleFunction, ToIntFunction,...

Java 类的加载机制

大致流程: 读取.class文件二进制文件–>验证与解析(格式 关键字 关键词 语法 引用 类型转化等等) –> 初始化 –> 使用 –> 卸载

CAS(Compare and Swap) 是利用底层硬件平台特性,实现原子性操作的算法,Java 1.5 以后 JUC(java.util.concurrent) 实现主要以此为基础;找了不少资料以下记录一下个人对于 CAS 的理解(部分资料 copy 的) 一、CAS 简述 从最基础的 Java 中的 i++ 操作来说,i++ 并非原子操作,实质上相当于先读取 i 值,然后在内存中创建缓存变量保存 ++ 后结果,最后写会变量 i;而在这期间 i 变量都可能被其他线程读或写,从而造成线程安全性问题 CAS 算法大致原理是:在对变量进行计算之前(如 ++ 操作),首先读取原变量值,称为 旧的预期值 A,然后在更新之前再获取当前内存...

一、概念和特征 直接内存并非 JVMS 定义的标准 Java 运行时内存。 JDK1.4 加入了新的 NIO 机制,目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗,此后 NIO 可以使用 Native 的方式直接在 Native 堆分配内存。 直接内存区域是全局共享的内存区域。 直接内存区域可以进行自动内存管理(GC),但机制并不完善。 本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。 可能出现 OutOfMemoryError 异常。 二、异常演示 测试代码: 1 2public class TestNativeHeap { 3 4 /** 5 * VM Args:...