Java JDK1.8源码学习之路 1 Object
写在最前
对于一个合格的后端程序员来说,现行的流行框架早已经能胜任基本的企业开发,Springboot 任何的框架都把重复的工作更佳简单/优化的解决掉,但是完全陷入在这样的温水里面,
好比温水煮青蛙,越是舒服下去,越不行,还是那句话,万变不离其宗。真正能了解JAVA在多少年来经久不衰的秘密,以及最基础,也是最重要的,还是得从源码下手,了解JDK开发人员的编码规范
以及实现JDK过程中的思路以及为了更加了解这款完美的语言!
中文在线版:https://blog.fondme.cn/apidoc/jdk-1.8-youdao/
目录
- 01 java.lang.Object 源码解读
- 02 java.lang.String 源码解读
- 03 java.lang.Integer 源码简单分析
public class Object {
//native 方法用于注册一个系统
//native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
private static native void registerNatives();
//静态方法块 在这个类加载的时候去调用这个静态的registerNatives()方法,用于注册这个调用系统底层的接口
static {
registerNatives();
}
//getClass 这个方法对于熟悉JAVA的反射再熟悉不过了
//反射就是在java运行过程中,通过类名.getClass() 可以获取到这个类运行过程中的字节码文件(Class文件)
public final native Class<?> getClass();
//hasCode返回一个对象在内存里面所表示的hash值
//如果两个对象的hash值相同,则表示这两个对象是相等的,或者说是同一个对象
public native int hashCode();
//比较两个对象是否相等,这里使用的是 ==号比较符号,判断两个对象是否有相同的内存地址。
//这里复习一下,==比较基本类型 比如int char floot 都比较的是他们的值
//对象使用 == 比较的时候比较的是他们的内存地址。
public boolean equals(Object obj) {
return (this == obj);
}
//对象的克隆方法,需要被克隆的对象需要实现Cloneable 接口 调用父类的clone()方法实现对象的克隆
protected native Object clone() throws CloneNotSupportedException;
//toString 方法,用于直观的表现出当前对象,一般表现形式是 对象名称+@+十六进制哈希值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//唤醒正在等待这个对象的某一个线程,这个唤醒是任意的
public final native void notify();
//唤醒所有等待当中的线程
public final native void notifyAll();
//让一个线程进入等待状态,传入一个毫秒数后运行,或者由另一个线程调用notify()方法让这个线程再次运行
public final native void wait(long timeout) throws InterruptedException;
//传入第二个参数,纳秒,是为了更好的控制让线程从等待到运行
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
//这个方法其实就是调用wait方法,只不过传入一个0ms的参数
public final void wait() throws InterruptedException {
wait(0);
}
//这个方法和垃圾回收机制有关,通知垃圾回收器开始运行,但是运行的具体时间不确定,垃圾回收器会清理掉当前内存中没有引用的对象
protected void finalize() throws Throwable { }
笔记:
阻塞状态:(等待状态)
一个线程执行了sleep() 或者suspend(挂起)后,将会失去CPU资源,进入阻塞状态。在睡眠时间过后,就会再次进入就绪状态。
阻塞的分类
- 等待阻塞:运行状态中,线程执行了wait()方法,使其进入等待状态
- 同步阻塞:在一个线程获取synchronized 同步锁失败(已经被占用)
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态
Java JDK1.8源码学习之路 1 Object的更多相关文章
- Java JDK1.8源码学习之路 2 String
写在最前 String 作为我们最常使用的一个Java类,注意,它是一个引用类型,不是基本类型,并且是一个不可变对象,一旦定义 不再改变 经常会定义一段代码: String temp = " ...
- 【JDK1.8】 Java小白的源码学习系列:HashMap
目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putV ...
- Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析
目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...
- JDK1.8源码学习-String
JDK1.8源码学习-String 目录 一.String简介 String类是Java中最常用的类之一,所有字符串的字面量都是String类的实例,字符串是常量,在定义之后不能被改变. 二.定义 p ...
- JDK1.8源码学习-Object
JDK1.8源码学习-Object 目录 一.方法简介 1.一个本地方法,主要作用是将本地方法注册到虚拟机中. private static native void registerNatives() ...
- JDK1.8源码学习-LinkedList
JDK1.8源码学习-LinkedList 目录 一.LinkedList简介 LinkedList是一个继承于AbstractSequentialList的双向链表,是可以在任意位置进行插入和移除操 ...
- JDK1.8源码学习-ArrayList
JDK1.8源码学习-ArrayList 目录 一.ArrayList简介 为了弥补普通数组无法自动扩容的不足,Java提供了集合类,其中ArrayList对数组进行了封装,使其可以自动的扩容或缩小长 ...
- JDK1.8源码学习-HashMap
JDK1.8源码学习-HashMap 目录 一.HashMap简介 HashMap 主要用来存放键值对,它是基于哈希表的Map接口实现的,是常用的Java集合之一. 我们都知道在JDK1.8 之前 的 ...
- Java并发包源码学习系列:挂起与唤醒线程LockSupport工具类
目录 LockSupport概述 park与unpark相关方法 中断演示 blocker的作用 测试无blocker 测试带blocker JDK提供的demo 总结 参考阅读 系列传送门: Jav ...
随机推荐
- Python之NumPy(axis=0/1/2...)的透彻理解
https://blog.csdn.net/sky_kkk/article/details/79725646 numpy中axis取值的说明首先对numpy中axis取值进行说明:一维数组时axis= ...
- CTF SSRF(服务器端伪造请求)
目录 CTF SSRF(服务器端伪造请求) 一.概念 二.危害 三.漏洞挖掘与判断 四.相关函数 五.IP绕过 六.Gopher协议 1.使用限制 2.构造payload CTF SSRF(服务器端伪 ...
- 第06组 Alpha冲刺(1/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11863075.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- 2019_软工实践_Beta(3/5)
队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ? 维持进度,检查需求 展示GitHub当日代码/文档签入记录 接下来的 ...
- linux 的 两种磁盘扩容
当LVM分区空间不足的时候,可以进行扩容.主要的扩容方法有两种: 通过空余的磁盘进行扩容,这个方法比较简单,不会对原有数据有影响.将其他LVM分区空间取出一部分给需要扩容的LVM分区.下面就分别具体介 ...
- Python开发人员指南
本指南是一个全面的资源贡献 给Python的 -为新的和经验丰富的贡献者.这是 保持由维护的Python同一社区.我们欢迎您对Python的贡献! 快速参考 这是设置和添加补丁所需的基本步骤.了解基础 ...
- 利用detours写了一个工具用于instrument任意指定dll的任意指定函数入口
目录 wiki Disas Dtest Simple withdll load一个dll到指定进程 tracebld显示相关进程涉及的文件读写操作 My Instrumentation tool: w ...
- web服务器请求代理方式
1 通信数据转发程序:代理.网关.隧道 代理:是一种有转发功能的应用程序,他扮演了位于服务器和客户端“中间人”的角色,接收客户端发送的请求并转发给服务器:同时也接收服务器返回的响应并转发给客户端. 使 ...
- mac php7.3 安装扩展
进入到PHP的目录 /bin/pecl install mongodb 其他扩展同理. 另外: Mac brew 安装的php的启动和停止: brew services stop phpbrew se ...
- Linux_CentOS 中systemctl 管理服务、防火墙 firewalld 以及 SELinux 配置
使用 systemctl 管理服务 systemctl 就是 service 和 chkconfig 这两个命令的整合,在 CentOS 7 就开始被使用了,systemctl是系统服务管理器命令,它 ...