
java的道与术
文章平均质量分 89
带你探索java的道与术
即刻实现工作室
Above all, don't lose hope.
展开
-
深入源码谈谈ReentrantLock中的公平锁和非公平锁的加锁机制
ReentrantLock是什么?干什么用的?我想在这里我就不用多赘述了,简言之就是用来加锁的,他和synchronized的语义是相同的,只不过它要比synchronized使用起来更加灵活,它的用法很简单,本文不做赘述。本文将深入ReentrantLock内部源码来看看ReentrantLock的加锁机制。一.ReentrantLock的公平锁和非公平锁ReentrantLock支持公平锁和非公平锁两种加锁机制,其默认是非公平锁。public ReentrantLock(boolean fair)原创 2021-03-05 13:53:56 · 3151 阅读 · 7 评论 -
谈谈HashMap源码中的优雅设计
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; // 初始化桶数组 table, table 被延迟到插入新数据时再进行初始化 if ((tab = table) == null || (n = tab.len原创 2021-02-27 15:09:48 · 8623 阅读 · 24 评论 -
细说ArrayList和LinkedList
一、ArrayList1.底层基本数据结构:Object数组transient Object[] elementData; 2.ArrayList容量ArrayList可以通过构造函数指定初始容量,如果不指定则默认初始容量为10,需要注意的是,当是默认容量的时候,创建一个ArrayList后,不会马上将底层Object数据初始化成10,而是指定成一个空数组。无参构造器源码如下:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENT原创 2021-02-23 23:29:57 · 534 阅读 · 0 评论 -
【小知识探究系列四】synchronized的加锁原理和膨胀过程探究(以64位jvm为例)
一、synchronized加锁原理由于synchronized总体的工作原理是通过操作对象头来实现加锁和解锁,因此在具体的了解synchronized之前,首先需要简单了解一下对象头。所谓对象头其实是每个对象都存在的一份存储当前对象gc分代年龄、hashcode、锁标记、当前获取到锁的线程ID等信息的一块内存区域。对象头主要分为以下三块:1.Mark Word2.指向类的指针3.数组长度(只有数组对象才有)synchronized在加锁过程中主要对mark word进行操作,因此主要对ma原创 2021-01-19 18:02:41 · 460 阅读 · 0 评论 -
【小知识探究系列三】探究stop、suspend线程中断方法被淘汰的原因以及替换方案
开头小诗一首以歌颂留在历史长河的她们:《题都城南庄》 崔护去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。醒醒,我这是在写技术文章,怎么开始吟诗作赋了,罪过。【废话到此为止】我们知道像stop、destroy、suspend、resume这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢,到底是人性的扭曲还是道德的沦丧呢,亦或是她们不思进取被取而代之呢,如果是被取而代之,原创 2021-01-15 11:04:43 · 781 阅读 · 2 评论 -
【小知识探究系列一】为什么Object方法的equals和hashcode方法需要同时被重写
之前看java技术相关书时总会看到这样一句话,即如果在自定义类中重写equals方法,那么同时需要重写hashcode方法。但是对深层原因没有去深究,本片文章就去一探究竟,为什么equals方法和hashcode方法需要同时被重写。结论:同时重写equals和hashcode方法的目的是方便我们将当前类的对象准确的插入到散列表中。原因如下:要想探究这个问题的原因,首先就得从往散列表插入一条数据的实现机制说起,我们以HashMap为例进行探究,先上HashMap的put方法源码:(Talk is che原创 2021-01-13 15:32:24 · 457 阅读 · 1 评论 -
【小知识探究系列二】String、StringBuffer、StringBuilder探究
一、StringString属于字符串常量,每次+=操作时其实都会创建一个新对象返回,原对象不会发生任何改变,因此在大量字符串拼接的场景中使用String类型会导致对象爆炸。字符串不可变的优点:便于字符串共享字符串存储在公共的常量池中,当将某个字符串数据copy一份时,由于是不可变的,即该块内存地址中的数据时不会发改变的,那么基于不可变性我们不需要再新申请一份地址存储相同的数据,我们只需要要将引用变量指向原来的那块内存地址即可。试想如果String是可变的,那么我们拷贝多份某个字符串后,由于他们均共享原创 2021-01-08 18:26:35 · 218 阅读 · 1 评论 -
Java BIO、NIO、AIO研究与探索
一.BIO(Blocking IO)(同步阻塞IO)(1)从Java启动IO读的read系统调用开始,用户线程就进入阻塞状态。(2)当系统内核收到read系统调用,就开始准备数据。一开始,数据可能还没有到达内核缓冲区(例如,还没有收到一个完整的socket数据包),这个时候内核就要等待。(3)内核一直等到完整的数据到达,就会将数据从内核缓冲区复制到用户缓冲区(用户空间的内存),然后内核返回结果(例如返回复制到用户缓冲区中的字节数)。(4)直到内核返回后,用户线程才会解除阻塞的状态,重新运行起来。总原创 2021-01-13 18:35:11 · 218 阅读 · 0 评论 -
Java8,9,10,11新特性探索
注:文中并没有列举出全部新特性,只列举出开发中较常用的特性一.Java8新特性1.支持Lambda使用案例:(1)定义一个interface,并且在接口中定义一个方法public interface LambdaFunctions { void function(String type);}(2)定义自己的方法,将LambdaFunctions作为方法的形参类型public class FlyEngine { public void fly(LambdaFunctions原创 2020-11-20 09:38:14 · 381 阅读 · 0 评论 -
java基础知识巩固-----类加载机制与反射机制
一.类的加载、链接和初始化1.当我们调用java命令运行某个java程序时,该命令将会启动一个java虚拟机进程,不管该java程序有多么复杂,该进程启动了多少个线程,他们都处于该JVM的进程里,同一个JVM的所有线程、所有变量都处于同一个进程里,他们都使用该JVM进程的内存区。从上面的这句话中我们可以看出,java程序时运行在java虚拟机的内存区的,同时同一个main方法开始的java...原创 2018-03-13 20:13:11 · 293 阅读 · 0 评论 -
成员变量和局部变量的初始化和内存运行机制分析
首先来看看什么是成员变量,什么是局部变量:成员变量:定义在class的方法外部,属于特定的实例化对象的变量或者不属于特定实例化对象的变量(被static修饰时该成员变量属于类的)。局部变量:定义在方法内部,作用域是从定义该变量开始到方法体结束,它是不属于对象或者类的一种变量。在java中成员变量不需要程序员显示的初始化就可以访问,因为java机制会默认初始化,而局部变量没有默认的初始化...原创 2018-03-12 19:12:19 · 502 阅读 · 0 评论 -
数组拷贝的方法比较
import java.util.Arrays;public class Test { public static void main(String[] args){ int[] a={1,2,3,4,5,6,7}; int[]s=new int[50]; System.arraycopy(a, 0,s, 0, a.length); Syste...原创 2017-10-18 14:54:36 · 310 阅读 · 0 评论 -
二位数组长度的求法
已知一个二维数组int[][]save:行长度:save.length列长度:save[i].length原创 2017-10-17 18:35:48 · 351 阅读 · 0 评论 -
关于protected修饰词的思考
先贴出protected的访问区间:同一包内或者在其子类中访问。虽然很简单的话但是对于一个初学者来说似乎会存在一些误解(没有细细考究之前我也是如此),而这个误解在哪里呢,先看几行简单的再不能简单的代码:package tesst;public class test1 { protected int i=0; protected void print(){ System.out....原创 2018-05-14 08:51:44 · 363 阅读 · 0 评论 -
java多态-----随笔
一.多态性Java引用变量有两种类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量的类型所决定,运行时类型由实际赋给该变量的对象类型决定。所谓多态就是类型相同在调用同一个方法时呈现出不同输出结果。多态出现的条件:1.存在继承关系2.存在子类重写父类方法的情况 举例:Person.javapublic class Person { int eye...原创 2018-03-27 11:23:20 · 238 阅读 · 0 评论 -
关于继承的思考
java的继承通过extends关键字实现,在英文中extends关键字被翻译成扩展,相对于继承来说翻译成扩展其实更能说明问题。当一个子类继承了某个父类时,首先它会获得除过父类的构造器方法外的其他方法和数据域,同时他还会有所扩展,也就是说他还可能会增加一些属性或者方法。这里对继承中相对重要的几点问题进行讨论:(1)super限定(super关键字的作用):所谓super限定就...原创 2018-03-23 16:37:18 · 220 阅读 · 1 评论 -
多线程
注:该博客或为自己所写以供个人学习之用一.线程与进程 1.几乎所有的操作系统都支持同时多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含多个顺序执行流,每个执行流就是一个线程。也就是说一个进程有1个或者多个线程构成。 当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行...原创 2018-09-16 21:53:43 · 263 阅读 · 0 评论 -
巩固java笔记----随笔
1.short byte char 在做运算时,先自动转化成int类型,再进行计算2.this关键字:在java中,this通常指谁调用这个方法,这个方法中的this就指向谁。3.java允许省略同一对象方法之间调用时的this关键字,但是虽然省略this是依然存在4.java不能用静态方法调用非静态方法(不能访问任何非静态资源),因为被static修饰的方法是属于这个类的而不属于某个特定的...原创 2018-03-13 19:37:22 · 323 阅读 · 0 评论