- 博客(58)
- 收藏
- 关注
原创 Vector为什么是线程安全的呢?Vector为什么是线程不安全的呢?
其实这个标题就有点猎奇了。其实对于大多数人来说,线程安全线程不安全,听起来更像是一种编码理论,实际并不会用到,而对于现在的Java程序员来说更是如此,层出不穷的框架早就帮我们明里暗里处理好了线程安全的问题,但是,我还是觉得有必要了解这些东西。其实对于Vector来说,大多数人可能比较陌生,知道的最多的就是面试的时候要说出它和ArrayList的区别,即一个是线程安全的一个不是,仅此而已,今天翻到...
2020-05-01 19:53:00
9210
2
原创 高性能MySQL笔记,第一章MySQL基础
MySQL整体架构分为三层,第一层主要是用来处理连接,核心功能其实就是获取sql语句,还有一些安全方面的操作,比如登录,获取权限等第一层获取了sql语句之后就会把sql语句交给第二层,第二层负责将sql语句进行解析和优化,以便让sql语句的执行效果更好,同时还会查询sql语句是否已经查询并留下缓存,如果存在缓存,就直接返回缓存中的东西,而不是实际查询第三层是实际执行查询的地方,就如我们写Jav...
2020-04-06 14:58:18
210
原创 aspose,word转pdf,及破解思路
最近项目里碰到这样一个问题,需要把doc格式的文档转换为pdf,我领导本来是准备先上传到百度云,然后获取百度云的略缩图(其实就是pdf)搞了几天,各种验证码,校验码,折腾的我头疼,最终查看了百度云的实现方式,发现是返回一个pdf给浏览器,那问题就很好解决了,只需要把获取的doc文件字节流转换为pdf字节流发送给前台即可网上找了一通,各种jar包一大堆,阿帕奇的jar包不收费,但是只能解析doc...
2020-04-01 22:03:33
2418
原创 Java性能优化第一章总结
木桶原理是指在计算机中,往往最后的性能取决于最差的那一块短板,而不是最好的那一块长版,往往是某一个部件的问题,导致了系统整体的性能问题,这点在Java性能优化中也是一个道理amdahl公式是指在一定负载情况下,增加cpu个数对整体性能的优化,公式为s=1/(1-a+a/n),其中a为可并行计算的负载,而n为cpu个数,其实这个n也不仅仅指代cpu个数,在分布式系统中,往往n代表计算机个数,可以发...
2020-03-26 22:03:36
135
原创 多线程基础nio和bio
实际上io之间的差别仅仅只有是否阻塞,以及是否同步同步/异步是消息通信机制,也就是调用者如何获取结果,同步是指调用者调用方法之后等待到结果出现才返回,异步则是调用者调用方法之后立即返回,结果是被调用者通过类似于观察者模型的方法被动获得结果阻塞/非阻塞是对等待结果这段时间线程的状态来讲的,注意,同步不一定是阻塞的,异步不一定是非阻塞的,得到结果之前线程一直有一条线程在等待,就是阻塞的,而如果得到...
2020-03-26 22:00:24
354
原创 Java生成桌面快捷方式(字节流生成)
所谓照猫画虎,想要知道生成桌面快捷方式,最快的方法就是去看微软的开发文档,微软官方文档链接,虽然本人英语水平有限,但是借助谷歌翻译基本阅读还是可以保证的前言基本没什么好看的,直接看目录第一章是一些名词解释还有一些说明,没啥用,第二章才是我们需要的大意就是说第一段字节标记了时间和可选结构还有其他一些信息,第二段指定链接的目标,也就是我们快捷方式指定的文件,那么如果只是为了实现最简单的快捷...
2020-03-12 17:06:24
1747
原创 读刘未鹏《暗时间》有感
我写技术文章也好,还是写这种读后感也好,一向倾向于趁热打铁,因为很多东西还鲜活的在脑子里,最近一段时间都在找工作,一直很焦虑,所以断了这么久,现在因为这个情况,也不敢出去,沉淀了几个星期,就找了一本很早以前放硬盘里的书看。话归正题,刘未鹏这本书给我触动很深,其实我们的时间也有质量之分,高质量的时间,一定是我们做着自己喜欢的事,全身心的投入,就像厨师做菜,可以是厨神,也可以是岛市老八,材料是一样的...
2020-02-18 16:33:44
544
1
原创 spring源码分析(三)XmlBeanDefinitionReader类
在XmlBeanFactory类中,XmlBeanFactory通过构造方法,以接近于下面这样的方式进行xml解析new XmlBeanDefinitionReader(this).loadBeanDefinitions(resource);所以我们就来讲一讲XmlBeanDefinitionReader类,照例,先看看官方是怎么说这个对象的*用于XML Bean定义的Bean定义读取器。...
2019-12-18 09:16:15
250
原创 spring源码分析(二)XmlBeanFactory类
我们传入的路径信息已经被ClassPathResource类处理完毕了,接下来就是解析xml,让我们尝试查看一下XmlBeanFactory类照例,看看官方是怎么描述这个类的*读取bean定义的{@link DefaultListableBeanFactory}的方便扩展*从XML文档。委托给下面的{@link XmlBeanDefinitionReader};有效*相当于对Defau...
2019-11-28 16:21:02
161
原创 spring源码分析(一)ClassPathResource类
本来说好的短时间不搞spring源码了,但是前端和数据库实在看不下去,加上力扣不知道为什么上不去了,就写个开头吧我们先写一段简单的spring程序public static void main(String[] args) { BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring.xml")...
2019-11-28 15:59:06
991
1
原创 算法-寻找两个有序数组的中位数
原题是力扣上的题目给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, ...
2019-11-26 14:55:59
274
1
原创 算法,第一周
/** * 题目 * 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数, * 并返回他们的数组下标。 * * 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 * * 示例: * * 给定 nums = [2, 7, 11, 15], target = 9 * * 因为 nums[0] + nu...
2019-11-22 20:46:17
105
原创 整理一下头绪
想学习的技术有很多,想看的东西有很多,但是我的一天只有24小时,并不会比别人多几个小时,加上发现如果保持博客日更,价值不大不说,还容易为了写博客而写博客,有些得不偿失,今天就把这段时间整理一下吧虚拟机和框架源码:这两个月把深入Java虚拟机看完了,自己也对原理加深的理解,目前想看openjdk和Javac,spring源码,但是考虑到收益,这个的优先级放在最后,短期不考虑后台框架:这个目前的优...
2019-11-21 20:25:52
267
2
原创 杂谈-关于spring cloud的一点想法(待续)
这段时间尝试搞了一下spring cloud,之前其实也搞过,不过时间太长,加上当时的demo早就被我删掉了,已经没有什么印象了,这次重新搞一下spring cloud,其实感受挺深的,为什么要用spring cloud的呢?简单来说就是解决三高问题,高并发,高可用,高性能的问题,听着确实高大上,但是其实代价也是极为高昂的,实际上spring cloud只解决了高可用的问题,高并发和高性能其实和它...
2019-11-20 17:17:39
621
原创 复习spring基本操作
spring也好久没用了,先复习一下spring的基本用法,然后去看源码吧,我已经把spring常用操作写成demo上传到码云了,还有什么功能想到就加上,点这个进入码云,这篇文章就水一下吧example层package example;import org.springframework.context.ApplicationContext;import org.springframe...
2019-11-18 17:07:23
122
原创 查看Java运行的汇编指令
openjdk的编译已经结束,但是坑还是很多,踩了那么多坑,我个人觉得,其实对于openjdk这种级别的项目,要么不开源,要么就认真对待,这两天的踩坑之路让我觉得openjdk的开发人员其实并没有重视所谓的开源,语焉不详的文档,牛头不对马嘴的下载链接,一波跟着一波的错误,甚至于当我们好不容易把openjdk编译成功,用编译器打开openjdk,紧随而来的就是几千行的报错,虽然都是路径问题,不影响我...
2019-11-18 11:02:50
687
1
原创 Linux(deepin15)编译openjdk8(2)编译
第一步,放弃前文那个openjdk,因为版本太老,对比较新的Linux极不友好,我编译那个openjdk报了N多错误,什么不支持的Linux(其实是判断条件没有4.X的Linux),什么找不到指令(新的gcc编译器已经删除该指令),还有各种稀奇古怪的问题,我就不一一列举了,前前后后忙活了2天,期间甚至想要放弃,好在最后还是坚持下来了说了这么多问题,其实解决方法也很简单,到官方仓库下载对应的版本,...
2019-11-15 11:20:05
222
原创 番外篇--文件备份系统
之前说过,我这个人有备份文件的习惯,而且不止一个备份硬盘,所以如果使用我之前的方式,先格盘,再进行复制,费时费力不说,还容易误操作,毕竟是人手点,时间长了很容易一下没把文件全部划下来,所以我就用Java自己写了一个文件备份工具类,现在我把这个工具完善了一下,增加了一些实用的功能,并在码云上开源了(地址),本篇主要记录了一下写这个系统的思路和坑吧本来最初我是想写一个简单的io流,把文件从一个盘迁移...
2019-11-13 16:41:56
165
原创 番外篇---一次文件拷贝对Java io流的思考
因为我这个人有备份文件的习惯,而且不止一个备份硬盘,所以如果使用我之前的方式,先格盘,再进行复制,费时费力不说,还容易误操作,毕竟是人手点,时间长了很容易一下没把文件全部划下来,所以我就用Java自己写了一个文件备份...
2019-11-12 16:20:30
172
2
原创 番外篇-使用脚本批量安装软件
前两天系统挂了,于是重装系统,由于我属于那种爱折腾的人,系统基本三天两头挂,就算不自己挂,过一段时间,我也会因为运行速度变慢自行重装系统,但是软件开发,你懂的,能偷懒就偷懒,让我安装系统就已经很难受了,还想让我一个一个去安装软件,做梦(¬︿̫̿¬☆),所以就写一个脚本自动安装软件吧 ps-其实脚本老早以前就搞定了,只不过一直没写成博客,正好这次想起来了,就写下来吧因为我习惯在Windows平台开...
2019-11-06 20:59:28
5626
2
原创 番外篇-反码,补码,原码的由来
最近在搞项目,被团队协作搞的头都大了,都是泪啊,本来我们组的人技术水平都不错,如果每个人单独写这个项目的话大概3天就能搞定,结果最后因为各种问题写了3天勉强把后台写完,写的我都怀疑人生了,今天实在顶不住了,就写写博客释放一下压力吧,好了,回归正题原码很好理解,就是最初始的编码,我这里用Java中的byte来解释byte b=1;b等价于0000 0001b+1等价于0000 0001+00...
2019-11-02 17:56:43
177
1
原创 Linux篇 (3)文件,目录的有关操作
其实对于Linux来说,最重要的就是文件的操作,在Linux的世界中,一切皆文件,而Linux世界中的一切简单而存粹,世界的变动便是这些文件的变动,如果掌握了这些文件,就掌握了世界,而目录的操作,就像是世界的创造和毁灭,虽无法掌握每个世界的变迁,但是却可以直接创造或是毁灭,而既可以掌握世界,又可以创造或者毁灭世界的,便是Linux系统中的上帝,root用户,而root的权柄也来源于此言归正传,对...
2019-10-26 10:06:39
190
原创 Linux番外篇-安装redis
因为最近需要用到redis,正巧最近也在看Linux,就尝试在Linux上安装Linux,之前安装的是Windows上的redis,但是毕竟官方的redis实际上是没有windows版的,windows平台上的redis属于微软自己开发的,虽然使用上没有差别,但是稳定性等各方面肯定还是存在一定差距,乘此机会学习一下首先是下载redis安装包,使用wget命令直接下载即可,http://downl...
2019-10-25 16:53:08
109
原创 Linux篇 (2)权限管理
就像Java提倡一切都是对象,Linux提倡一切都是文件,这点从Linux的权限管理中体现的淋漓尽致,所有用户的权限都分为三种,读,写,可执行,对于Linux来说,所谓程序也不过是一段可执行的文件罢了回归正题,想理解Linux的权限管理,首先要理解多用户的概念,其实在windows中,多用户的概念就已经存在了,但是存在感极低,我个人觉得有以下几个原因,首先,windows的稳定性差,闭源,高昂的...
2019-10-24 17:13:54
106
原创 Linux篇 (1)重启,关机,和一些小工具
上文介绍了怎么安装Linux,其实安装Linux只是第一步,接下来,我们尝试在Linux上执行一些在windows上的基本操作首先是一些基本概念,Linux中的TAB键可以用于提示,可以用来打印一些可能的指令,如,对a使用两次TAB其次,我们可以使用–help选项让大部分指令打印提示信息,–help可以简写为–h(说是大部分,其实我自己测试应该基本上都有这个选项)如果觉得help的提示...
2019-10-23 15:09:48
6594
3
原创 Linux篇 (0)初篇-安装Linux及连接ssh
前言因为对Linux系统不太熟悉,导致openjdk的编译一直难以继续,虽然影响不大,但是一旦涉及到虚拟机底层的知识,就感觉无从下手,虽然网上有已经编译好的openjdk,但我始终认为,代码是活的,光去看那一堆杂乱无章的代码,而无法运行,就像盲人摸象,雾里看花,是不可能体会到隐藏在代码中的神韵,就拿上篇文章来说,其实我想把volatile关键字一并讲解,但是如果想要看出不同之处,势必要去查看最终...
2019-10-23 11:20:14
137
原创 杂谈-Java中为什么基本数据类型不能加锁,i++为什么是一个线程不安全的操作
当我们初学Java多线程概念的时候,其实总是有些疑惑,为什么基本数据类型不能加锁?以及i++为什么是一个线程不安全的操作,从直觉来说,基本数据类型不能加锁这个问题,似乎很好理解,无非是数值本身是没办法当作一把锁的,就像你家隔壁的大黄要用绳子拴住,而不能用一根头发拴住,虽然牛头不对马嘴,但是至少不是那么让人难以理解,但是i++为啥是线程不安全呢?从直觉来说,多线程这种操作就好像是本来一个人干的活,好...
2019-10-21 11:16:26
1584
3
原创 番外篇-根据前文的文件上传系统实现一个Java在线运行工具
首先,我们要先对前文的上传系统进行修改,首先是前端<!DOCTYPE html><html><head> <meta charset="utf-8"> <title></title></head><body> <textarea rows="100%" c...
2019-10-18 20:52:45
159
2
原创 番外篇-自己实现一个Java文件上传系统
先解释一下为什么Javac系列鸽了,现代语言编译系统是庞大且臃肿的,尤其是在jdk7之后将一部分验证工作交给Javac,解语法糖,编译优化,验证,将代码转换为指令,我花了大概2天,大量使用的重载,接口和隐晦的实现类让人头疼,只能断点调试才能确定最终的调用方法,其中各种lambda表达式更是让人不知所云,如果代码量不算庞大,我可能会有兴趣啃下这块硬骨头,但是至少20个以上的类,40个左右的方法,也许...
2019-10-18 17:10:01
797
原创 javac编译流程(3)将传入参数进行处理
接上文javac编译流程(2)处理空值我们继续查看try { argv = CommandLine.parse(ENV_OPT_NAME, argv); } catch (UnmatchedQuote ex) { error("err.unmatched.quote", ex.variableName); ...
2019-10-12 12:48:23
503
1
原创 javac编译流程(2)处理空值
接上文javac编译流程(1)准备阶段回到compile方法public Result compile(String[] argv, Context context) { if (stdOut != null) { context.put(Log.outKey, stdOut); } if (stdErr != null...
2019-10-08 20:14:12
162
1
原创 番外篇,jdk自带动态代理源码分析
之前和同学聊起代理模式,顺嘴提到了动态代理,就顺便看了一下源码,话不多说,开始分析,和之前一样为了方便理解,我会直接在代码中注释这是一段很常见的动态代理代码,xx是一个接口,里面只有一个xxx方法,xxx类实现了xx接口,代码也比较简单,我就不全部贴出来了import java.lang.reflect.InvocationHandler;import java.lang.reflect.M...
2019-10-07 03:22:50
555
1
原创 javac编译流程(1)准备阶段
序言因为本系列属于我自己独立书写,没有任何成系统的参考资料和教程,基本上可以说是生啃源码,肯定存在不足和纰漏,请多多谅解,本系列基于jdk9,如果和读者手上的版本不同,可以互相参考,原理是相通的,主要的说明我会放到代码的注释中,便于理解首先,第一步,进入main方法中import com.sun.tools.javac.Main;public class Test{ public ...
2019-10-06 01:43:03
223
原创 如何查看Javac源码
序言讲Javac之前我想和大家聊一聊Java到底是个什么东西,这个全世界最流行的语言,它所构成的基础是什么?其实对于Java整个技术体系来说,所做的事无非是这几步,将Java文件转为class文件,再将class文件放入jvm中执行,虽然限制于平台,编译器,虚拟机的实现,相同的代码,最终生成的class文件,执行的流程可能完全不同,但是整个流程基本上是相似的。我在之前的文章曾经详细的讲述了cl...
2019-10-04 17:28:40
2080
原创 动态连接
序言对于Java程序来说,最重要的特性就是他的灵活,和可拓展性,在Java刚刚面世的时候,一次编写,处处运行无疑是最振奋人心和吸引程序员的,而在我们刚刚接触Java的时候,Java的重载,继承,多态性也让人好奇,如此灵活的使用方式到底是从何而来,实现这一切的根基就是本篇所讲的动态连接我之前在虚拟机类加载机制(五)类解析的过程说过,其实...
2019-09-30 15:44:41
421
1
原创 操作数栈
序言对于操作数栈来说,其实他本身的概念是很模糊的,我们基本上只能通过对字节码指令进行反推才能得出他的结果,但是其实他又深深的藏在字节码指令的每一个角落,基本上所有的字节码指令都是围绕它展开的,小到加减乘除,大到现如今互联网浪潮中的每一次激浪,都离不开他,可以说,他是Java的基石对于栈这个概念,其实我们多多少少都有所了解,所谓栈,无非就是出栈和入栈,Java虚拟机中的操作数栈也差不多,但是相对...
2019-09-26 10:56:28
959
6
原创 局部变量表
局部变量表我在之前提过,实际上就是方法运行时的变量表,已经在.class文件中存在了,但是我们还需要扣一下细节,Java虚拟机并没有规定变量的大小只是说一个slot(变量的最小单位),必须可以存放一个boolean,byte,char,short,int,float,reference(引用类型)实际上就是指一个slot至少可以存放一个32位的数据,但是至少可以,说明是大于等于,如果有哪个jv...
2019-09-25 15:57:16
1278
原创 虚拟机运行时栈帧结构
栈帧即是一个方法运行的过程,从方法开始执行(入栈),到返回结果(出栈),的完整过程对于Java虚拟机来说,其实一个栈帧的大部分信息已经包含在.class文件中了,仅仅会因为jvm实现的不同会有略微的差别栈帧中包含以下几个基本结构,局部变量表,操作数栈,动态连接,返回地址,我会在后面的章节专门讲解具体概念我在这里先简单讲解一下他们的作用,局部变量表主要用来储存方法运行过程中定义的局部变量下面...
2019-09-23 11:06:54
158
1
原创 类加载器和双亲委派
关于类加载器的话题,我在class加载的过程中提到过,本质上就是用来确认到底从何处获取class,而jvm把权力交给了程序员,我们可以手动获取指定位置的class需要注意的是,不同的类加载器加载的class对象是不同的,即使他们完全一致,方法区也会存在两个class对象(如下),这就要提到双亲委派了public class TestClassLoader extends ClassLoader...
2019-09-21 16:29:48
156
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人