- 博客(76)
- 收藏
- 关注
原创 golang map原理的一点研究
扩容时会创建新的桶和溢出桶,此时如果访问map,会在旧桶和新桶中查询值,如果写入或删除旧桶中的元素,则会导致目标旧桶中的元素被分发到对应的新桶。map的所有桶都是连续的,其中mapextra.overflow 占据了一部分连续的空间用来分配溢出桶,每当hmap.buckets中的桶发生溢出时就会到mapextra.overflow 的空间中申请一个桶。因为一个bmap代表的桶只存放8个键值对,所以需要有溢出桶保存溢出的键值对,溢出桶形成一个链,overflow则保存了下一个溢出桶的指针。
2023-02-14 19:59:43
227
1
原创 golang fmt.Sprintf(“%.2f“) 的舍入问题
首先,fmt.Sprintf("%.2f")使用的是banker rounding 而不是四舍五入
2023-02-13 19:39:16
2931
2
原创 prometheus increase函数统计得到小数
今天发现prometheus的increase函数得到了小数,研究一下源码,以下是rate/increase/delta 对应的计算函数
2023-02-10 12:02:00
1159
原创 ThreadPoolExecutor源码研读
原文为https://www.cnblogs.com/huangjuncong/p/10031525.html,因为博主加了注释所以会使用一些他的图片,侵删。对于博主没有讲到的部分会使用jdk源码的截图为什么要用一个ctl记录线程状态和线程个数?因为需要得到一个对这两个量的同一快照,如果使用两个变量则需要一个锁,而使用一个变量不需要(赋值操作是原子的,赋值后在对副本进行解析,可以保证是同一个的快照)。这种设计非常巧妙,值得学习线程池状态:RUNNING:运行状态,接受任务且处理阻塞队列中的任..
2021-10-03 21:12:21
160
原创 LinkedBlockingQueue源码研读
上次被问到实现线程安全的队列,想了下LinkedBlockingQueue源码读的一知半解,所以再来一次断点1设置了可中断的锁,这个也符合put操作可中断的特性断点3 c==0容易误解,注意这个c是getAndIncrement的结果,所以c是目前的size-1,所以当c==0时代表size为1,即可以唤醒阻塞在notEmpty的线程然后就是断点2和断点3下面的signalNotEmpty的设计,这里困惑了好久,为什么只在size==1时唤醒一次阻塞在notEmpty的线程,然后由p
2021-09-23 15:24:49
85
原创 CountDownLatch源码研读
CountDownLatch是用AQS实现的一个工具,大概意思是当有足够多的线程执行了countDown方法后await在countDownLatch上的主线程就可以继续运行了,下面来看看它的源码和ReentrantLock一样也有一个Sync的AQS实现,但是这个Sync非常简单,可以看到tryAcquireShared根据state是否为0返回acquire是否成功,如果为0则说明已经有足够的countDown执行过了,如果不为0则还需要等待。await直接调用acquireSharedInte
2021-09-21 14:29:28
96
原创 ReentrantLock源码研读
继续整理这几天读的源码ReentrantLock是AQS的一个实现,让我们看看它的源码其有三个内部类Sync,NonfairSync,FairSync,后面两个继承了Sync,Sync继承了AQS。后面二者是真正工作的类,NonfairSync用于非公平锁,FairSync用于公平锁,这二者除了tryAcquire方法外都使用Sync的方法实现,我们先看看Sync首先是这个nonfairTryAcquire,逻辑很简单,如果当前state是0即锁空闲,则CAS加锁,成功后使用setExclu
2021-09-21 14:28:56
76
原创 AQS源码研读
首先要说明,AQS中队列使用双向链表实现,其中头节点为可能占有资源的线程(这里说可以是因为调用acquire的线程会在未入队前尝试竞争一次资源,如果成功则直接抢占,此时这个节点不需要入队,头节点也就不是占有资源的线程了)AQS中一个节点代表一个线程,节点有一个状态,大于0为被取消状态,小于0为有效等待状态,0新节点默认状态AQS的入口为acquire/release和acquireShared/releaseShared首先在这里面调用用户实现的tryAcquire如果成功则直接返.
2021-09-20 14:26:01
107
原创 spring singleton循环依赖的一个探索
这两天稍微看了一点spring bean生成的源码,算是自己探索了一点点东西,感觉这块稍微明白了一点,下面定义的A和B都是Singleton注意!:如果A是构造器依赖,B是Setter依赖,A和B循环依赖时,如果先加载的是B,则不会出现循环依赖异常,因为B加载时会先将未依赖A的B实例放入缓存,然后递归到A进行有参数构造器初始化,这时A可以拿到B的实例完成注入,然后B也可以依赖A但是反过来不行,如果先加载A,那么A会执行有参数的构造器,这时没有A的实例构造出来,缓存中没有A,在构造A前递归构造B,虽然
2021-09-10 16:29:45
76
原创 Java并发编程实战 第三章 对象的共享
主要讲了两种构造时可能出现的问题,一种是未构造完成的对象逃逸,一种是由于JVM重排指令导致的状态异常,个人感觉书中讲解的不是很透彻下面是对象逃逸的一个例子,注意final域也面临对象逃逸问题,虽然在构造器中无法使用未赋值的final域,但是在别的线程调用对象时可以看到未赋值的final域,此时对象还未构造完public class Main { Main(int i,int j) throws InterruptedException { //! System.out.pr
2021-03-26 18:39:51
96
原创 深入理解JVM 第八章 虚拟机字节码执行引擎
一个栈帧需要分配多少内存并不会受到程序运行时变量的影响,只取决于源码和虚拟机实现方式记录问题:书中说局部变量表的复用可能会导致垃圾回收不及时,做实验看一下static void test1() { { byte[] placeholder = new byte[1024*1024*64]; } System.gc(); }这一段代码用-verbose:gc -XX:+UseSerialGC -X..
2021-03-11 19:59:27
75
原创 深入理解JVM 第七章 虚拟机类加载机制
好久不写,但是这章真的重要虚拟机规范中对于什么时候加载类并没有一个统一标准,但是初始化是有且只有六种情况才会进行,详见书中263页,下面记录几个问题和重点------------------------------------------------------------读取或设置一个类型的静态字段时会初始化该类,但不包括被final修饰的在编译器把结果放入常量池的静态字段:这里暗含了一个知识点,只有基础类型和String会在编译器被标注位ConstantValue放入常量池,也就是说其他类型
2021-03-09 21:26:30
60
原创 深入理解JVM 第三章垃圾收集器与内存分配策略
引用计数算法:为每个对象添加一个引用计数器,每次被引用就加一,这样做需要额外的处理才能解决循环引用等问题可达性分析算法:以GC Roots为起使点集,如果某个对象不可达则证明此对象不再被引用之前一直搞不明白软和弱的区别软引用:在系统发生内存溢出之前会对软引用进行回收弱引用:比软引用更弱一点,被弱引用关联的对象只能存活到下次垃圾回收虚引用:无法使用虚引用得到对象实例,只能在其对象被回收时收到一个系统通知对象收集:当一个对象被判定GC Roots不可达时会被第一次标记,之后如..
2021-03-01 12:32:53
87
2
原创 深入理解JVM 第二章 内存区域
程序计数器:标记当前执行的字节码行号,控制程序执行顺序。每个线程拥有自己的程序计数器Java虚拟机栈:每个Java方法执行时都会创建一个栈帧,用于保存局部变量表,操作数栈,动态连接,方法出口等信息。进入方法后需要在栈帧中分配多大的空间是确定的,不会在方法执行时改变。线程私有本地方法栈:与虚拟机栈类似,执行本地方法时分配Java堆:所有对象实例几乎都分配在堆中,被所有线程共享方法区:储存被加载的类型信息,常量,静态变量等,被所有线程共享运行时常量池:方法区的一部分,用来保存运行时产生的字面
2021-03-01 10:34:42
57
原创 mysql源码编译与安装
搞了好久,我真是裂开基本步骤都在这里http://www.jydba.net/windows-7-vs-2013%E7%BC%96%E8%AF%91%E4%B8%8E%E5%AE%89%E8%A3%85mysql-5-7/但是有几个问题1.my.ini里面的路径必须是双斜线:D:\\TestProgram\\TestProgram_SQL\\mysql-5.7.24-winx64一开始这个样子是不行的:D:\TestProgram\TestProgram_SQL\mysql-5.7.24
2021-01-11 22:03:35
153
原创 数据库系统实现 第四章
记录一个东西数据库系统实现 第四章 4.5.6这个地方关于R能省1/6的磁盘IO想了好久。原因是S的一个桶(设为si)保存在内存中,所以从磁盘读取R的元组散列时如果散列入了si桶所对应的桶(设为ri),就不需要将其写回到磁盘,而是可以直接将这个元组与内存中si桶中的所有元素进行计算,将结果输出,这样ri桶中所有的元素都不用送回内存,节省了IO只能说妙...
2020-12-14 15:23:59
121
原创 数据库系统概念 第五章
这张比较难,属于较高级的内容,很多都不太领会,记一点琐碎的知识procedure不能在sql语句中调用,只能在别的procedure或嵌入式sql中调用函数可以作为sql语句的一部分过程和函数必须声明为确定性或不改变数据的才能在开启bin-log状态下使用具体可见https://blog.csdn.net/ty_soft/article/details/6940190...
2020-10-04 23:10:43
411
原创 数据库系统概念 第四章习题
4.1.cselect C.*, I.ID, case I.name when I.name then I.name else '-' endfrom course as C natural left outer join teaches as T natural left outer join instructor as IMySql中没有decode,可以用case来代替,如上4.2.bselect * from student natural join takesuni.
2020-09-28 21:07:20
2226
原创 数据库系统概念 第三章习题
3.1.eSELECT (SELECT COUNT(ID) FROM takesWHERE takes.year = section.yearand takes.semester = section.semester and section.sec_id=takes.sec_id AND section.course_id=takes.course_id // group by section.sec_id 这里是错误的) as xFROM sectionWHERE section.y
2020-09-24 19:51:45
1706
原创 重学OS 第三章 内存管理
无储存器抽象:没有逻辑地址,直接使用物理地址。这样是很危险的,用户很容易破坏操作系统,同时很难实现多个程序同时运行(可以使用静态重定位技术解决但是需要将地址和操作数区别对待,同时也不够高效)。主要用在单程序系统中,这种系统中的程序一旦装入就不会改变了。抽象地址空间:每个进程拥有从0开始的抽象地址,使用基址寄存器将抽象地址转换为物理地址,使用界限寄存器确定地址的合法性动态内存分配:内存分配表+内存分配算法在动态内存分配时可能出现内存不足的情况,解决方法:对换技术:当内存不足时,将阻塞的进.
2020-08-18 19:13:44
276
1
原创 重学OS 第一章/第二章 引论/线程与进程
主要记录一些细节和思考通过库过程系统调用,感觉和过程调用的区别主要在6,9,即不会陷入内核,性能上的区别在之后的博客会讨论典型的进程表项中的内容,具体实现可能有不同,进程和线程切换的开销有一部分出自这里,之后讨论这是书中的一种陷入中断的处理流程,和计组中学到的有点不同在于:第三步汇编语言过程会将寄存器值保存入进程表项,这里保存的包括第一步硬件压栈的寄存器和无法用硬件压栈的一些寄存器,而机组中不存入进程表项只压栈。对这个不同的理解是可能保护现场只是一个概念,并没有绝对的要求..
2020-08-15 02:08:59
174
原创 设计模式 第四章复习总结
复习第四章,顺便补笔记,代码就不贴了主要谢谢认识这段话基本解决了我对Adapter和Bridge之间区分的问题,相比而言Adapter轻量一些,使用Adapter来匹配两个写好的接口而且不需要考虑(也无法考虑??)之后的变化。而Bridge更加重量级,使用Bridge时知道系统的实现和抽象是相互独立且独立演化的,使用Bridge将二者解耦并建立之间的联系。Adapter使用在类设计好之后,Bridge考虑在类之前。关于Composite,Decorator,Proxy之间我认为还是比较.
2020-05-14 19:38:41
111
原创 JNI2-4
补一下jni的笔记,每次看完都不想发博客,懒得要死关于函数内部是否有分配内存,只能通过对每个函数的了解判断吧,学完了看看源码这一句没看太懂,是说可能释放String内部的char数组吗死锁出现的情况这个真的很重要,今天的教训:出现找不到域或者方法的异常大多输都是由于签名写的不对又回到类似管理指针的混乱中了/。。。总的来说引用这一块如果可以估计上下文使用的数量,可以调用Push/PopLocalFrame,这是...
2020-05-09 13:42:08
128
1
原创 Android 动态修改ConstrainLayout
如果需要修改组件大小可以使用ConstraintLayout.LayoutParamsConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(width,height);holder.catView.setLayoutParams(paramsView);但是有个问题,这样修改完父布局后,子布局与...
2020-05-05 20:37:49
2275
原创 Android 关于内存权限的问题,坑呀!!!!!!!!!顺便记录一些leancloud的东西
用leancloud作为数据库,在储存图片的时候产生了一些问题首先是leancloud可以用Pointer来存储对象,但是这个被存储的对象一定要先存好,不然会有问题 final AVObject object = new AVObject("Login"); object.put("id",id); object.put("psw",psw)...
2020-04-30 20:29:00
410
原创 JNI 1
jdk 10之后javah已经不用了,改用javac -h,比如javac -h . Hello.java记录两篇有用的资料:https://blog.csdn.net/weixin_33901843/article/details/85991404https://blog.csdn.net/gzhjavagzh/article/details/52155987...
2020-04-28 19:08:35
117
原创 设计模式:可复用面向对象软件基础 第三章(1)
这本书没有办法划重点,每一句话都让人觉得精彩,适合反复阅读,下面说些自己的理解。网上很多文章认为 Factory Method 与 Abstract Factory 之间的区别在于,后者在一个工厂中实现了一类 Factory Method,而我认为其中有着重点的不同, Abstract Factory 强调产品的特异性(如车窗与车门之间的特异性,是车的不同组件),而 Factory Metho...
2020-04-21 17:56:25
132
原创 设计模式:可复用面向对象软件基础 第一章
关于组合和和继承的想到的一个例子,如果所有图形都是继承自Shape,且现在有一个Window类,如果Window的形状是不可变的,就用继承,表示窗户“是”什么形状;如果Window的形状经常改变,就用组合,表示窗户“拥有”什么形状这个东西可以这么理解,你和你的老婆就是聚合,你和你的八个情人就是相识。...
2020-04-16 15:23:26
113
原创 java编程思想 序列化
import java.io.*;public class Ans { public static void main(String[] args) throws IOException, ClassNotFoundException { //test0(); //test1(); //test2(); //test3(...
2020-03-06 02:37:24
138
原创 java编程思想 第十八章 字符流
import java.io.*;import java.util.Arrays;public class Ans { public static void main(String[] args) throws IOException { //test1(); // test2(); //test3(); test4()...
2020-03-03 22:49:29
85
原创 java编程思想 第十八章 字节流与装饰器
import java.io.*;import java.util.Arrays;public class Ans { public static void main(String[] args) throws IOException { //字节流是java 1.0提供的老方法,主要存在于一些老的代码中 FilterInputStream fis ...
2020-03-03 22:48:56
98
原创 Blog 正则表达式
总的来说博客中讲的太少了,还是要看编程思想,里面有关于这部分非常全面的讲解。import java.util.regex.Matcher;import java.util.regex.Pattern;public class Ans { public static void main(String[] args) { test1(); test...
2020-03-02 23:19:46
101
原创 Blog 时间与日期
import java.time.*;import java.util.Calendar;import java.util.Date;import java.util.Locale;import java.util.TimeZone;public class Ans { public static void main(String[] args) { test...
2020-03-02 23:18:23
131
原创 数据库系统概念 第二章-代码
今天主要搞了下环境,了解了各种工具怎么用,比较重要的收获:select * from world.city group by countrycode; #这里每组挑一个代表呈现在mysql8中加入对with的支持,所以目前我用的5.7版本还不能使用这个MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令...
2020-03-02 21:26:04
153
原创 面向对象软件工程 第三章 软件过程
需求工作流主要是帮助开发者理解客户需求,分析可行性,对软件有一个清晰的认识;同时,帮助客户了解开发得到的产品的大致性能。首先,开发一个软件的首要任务一定要理解这个软件的应用领域,这样可以减小与客户沟通的障碍,减少常识性的错误。开发者和客户都是人,所以对事物的理解都会出现偏见,一定要超越这种偏见分析工作流主要是精化需求过程的制品,并使用严谨的描述方式呈现给开发者,对每个类的功能以...
2020-03-02 16:05:48
183
原创 现代操作系统 第二章(3)
这是这一章的最后了,没什么要写的,介绍了一些调度算法,和调度算法的使用目的,都比较好理解但是需要实战中加深认识。令人意外的是使用了随即机制的彩票调度在非常简介的同时有用非常强的可行性,看来这类随机算法常常都可以达到非常好的效果,类似的还有路由中的随机等待等。...
2020-03-02 13:10:02
110
原创 Blog 泛型
import java.lang.reflect.ParameterizedType;import java.util.Arrays;public class Ans { public static void main(String[] args) { test3(); test6(); } static void test0() ...
2020-03-02 00:03:02
90
原创 java编程思想 持有对象(三种弱引用与WeakHashMap)
其中SoftReference只在内存不够时回收其包含的对象,WeakReference则在任何时候都可能回收。而PhantomReference则最弱(虚引用),任何时候都不能从中get对象(只会得到null),而且必须和ReferenceQueue一起使用,它存在的目的就是监控包含对象被释放的事件,从而可以起到finalize的作用,即可以做最后的善后工作。(finalize已于java SE...
2020-03-01 21:46:11
193
原创 数据库系统概念 第四章
试图保存的是一种计算关系,而不是副本,因此不管是在视图上还是原数据上做出的修改都会以重新计算的方式体现在视图上(可以理解为一种需要计算的引用??)使用check构建参照完整性约束:类型与域:一个是创建了副本,一个是创建了”引用“...
2020-03-01 17:17:08
870
原创 Blog 注解
注解是以前忽略的一个东西,然而今后参与到正规团队开发中应该会比较重要,所以先学一学import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Ta...
2020-02-29 23:42:10
106
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人