- 博客(55)
- 资源 (1)
- 收藏
- 关注
原创 深入浅出JUC常用同步器
这个同步器相对比较简单,先使用构造方法初始化共享锁数count,然后每次调用countDown()方法, 内部调用sync.releaseShared(1)释放一把锁,锁数减一,直到锁Count等于0则会唤醒之前使用await()方法阻塞的线程。同步器出现之前,通常采用Thread.join()方法来实现,join方法不够灵活,JDK大佬就在JUC下新建了几个同步器,底层都是基于AQS实现。2. node为空,是否共享,是则构建共享锁节点,否则构建独占锁节点。,相对来说,功能更加强大。
2024-11-11 23:59:21
902
1
原创 剖析源码,带你看懂JUC线程池运行机制
只需要实现RejectedExecutionHandler 这个接口重写rejectedExecution 方法接口即可。一个简单示例如下:比如com.zaxxer.hikari.pool.HikariPool 实现了自定义注册策略。
2024-11-11 20:16:39
967
原创 JUC并发队列及应用
引用类型作为集合作为另一个集合的构造函数的参数,【引用传递】使用同一份引用,此时要采用。由于该是线程独立私有,因此多线程情况下不会发生生成同样随机数的情况,同时也避免了CAS所带来的锁竞争引发的CPU资源损耗。特点:同时只能有一个线程进行入队或出队,但是由于是无界的,可一直put,不会陷入阻塞,内置使用。实现线程安全方式:CAS【非阻塞】,poll出队和add/offer方法入队都是采用。阻塞队列:为了保证线程安全采用阻塞线程方式操作队列。方法】,poll和offer对应【非阻塞队列:不阻塞线程操作队列。
2024-11-10 17:15:04
907
原创 深度剖析JUC中LongAdder类源码
1.LongAdder 和LongAccumulate 之间的关系,longAccumulate 是通用累计计算器,不仅可以实现累加,还可以根据用户自定义函数来实现累计功能,LongAdder 是其中一个特例,相当于就是一个longAccumulate 默认实现。3.Cell数组占用内存相对较大,一开始是null,只有在使用到Cell数组才会创建,惰性加载/懒加载方式。将一个变量拆分成多个变量,高并发场景下让多个线程竞争获取多个资源,用以减少竞争资源冲突,从而提升性能。其中比较重要的四个参数在下图列出。
2024-11-10 15:03:01
848
原创 一文带你看懂Java多线程并发,深度剖析AQS源码
随着互联网数据和访问请求流量的日益增加,单核CPU /单线程处理任务的效率已经无法满足人们都系统响应的要求,且伴随着多核CPU时代的到来,多线程并发处理任务,能同时利用多个CPU同时并发处理海量的系统请求,极大的提升系统性能。来存储对象,ThreadLocal 对象属于线程私有,每个对象只会存储对象的一个副本,线程在操作该对象时,只会操作当前线程内部的对象,从而做到数据隔离,线程安全。方式,其中可以使用Unsafe类来给对象定制化CAS操作,谨慎使用Unsafe类,这个类可以直接操作内存。
2024-11-10 00:50:47
1296
原创 深入浅出理解Spring和SpringBoot,剖析自动配置源码
说白了,之前使用Spring、SpringMVC等框架进行开发过程中,需要手动配置各种各样的JavaBean对象,要么是通过注解实现,要么是XML实现,要么就是两者混合实现。SpringBoot为了简化频繁手动配置这个问题,就构建出了一个自动配置功能,极大简化开发人员的配置时间,提升项目开发效率。
2024-11-08 18:10:22
1725
1
原创 从Java中String类分析开始,深度解析Java线程安全机制
这两个可重入锁底层都是基于AQS实现。的作用,内存地址不可变性,同一时间只允许一个线程对某个String对象进行修改操作,执行完成后,会重新赋值暴露给其他线程,这个过程对其他线程是隔离的,也就天然保证了并发执行的线程安全。(3) 自旋锁:不断循环竞争获取锁操作,线程不直接陷入阻塞,适用于线程竞争较少的情景,一旦自旋次数过多,CPU资源会大大消耗,性能下降明显。读不加锁,写时加锁,写时复制锁,典型 CopyOnWriteArrayList,思想就是写操作前,先进行复制,然后修改完后,重新赋值。
2024-11-08 12:31:53
1099
原创 从Java中使用new 关键字创建对象开始,深度剖析对象结构与存储
随着后续线程竞争获取锁时,如果上个线程没执行完,则会立马回到savepoint暂停执行,锁直接升级轻量级锁,cpu轮询时间切片执行其他线程,如果上个线程执行很快,立马执行完,释放了锁,那么此时线程获取锁仍然是偏向锁。偏向锁性能相对较高,一旦升级为轻量级锁,当后续涌入大量线程发生竞争获取锁时候,会不断自旋获取锁,当自选周期达到500个时钟周期,或者极端情况下,轻量级锁已经无法管理整个线程运行情况时,此时会升级为重量级锁。记录了对象分代年龄,锁,线程id,hashcode信息等,为什么这么设计呢?
2024-11-07 18:40:54
886
原创 从分析Vue实例生命周期开始,剖析Vue页面跳转背后执行过程
Vue3虽然兼容Vue2,但为了代码可读性、扩展性、可维护性,建议尽量不要混合使用,Vue3钩子函数需要放到setup函数中,且一个Vue文件最多只能有一个setup。Vue3是Vue2的升级版,性能得到极大提升,打包体积减少41%,初次渲染快55%,内存减少54%,相比Vue2开发更加高效,运行速度更快。这个函数表明浏览器已经完成对DOM元素的挂载渲染了,此时可以拿到DOM元素并进行DOM操作,一般书写页面初次进入,挂载DOM树完成后所需要执行的DOM操作,都在这个钩子函数中。这个在页面组件更新前执行。
2024-11-07 13:05:38
1162
原创 深度剖析浏览器请求行为, 输入www.baidu.com 回车后,背后发生了什么?
本文旨在分析浏览器从发送请求到页面加载渲染整个背后系统执行过程,其中关于后台的运行过程细节进行了隐藏。
2024-11-06 20:20:27
1357
原创 java中静态数据(块)、main方法、构造块、构造函数的运行顺序
前言最近在啃《Java编程思想》,其中有很多东西,以前学过,有些都忘了,于是乎,我就想着捡起来,看到第七章《复用类》,文章中提出通过组合、继承的方式来进行类的复用,当然还可以通过代理(虽然java不直接支持代理)。关于“组合”稍微提下,就是在新的类中产生现有类的对象,通俗点就是将一个的类对象作为新类的成员变量。关于"继承",也稍微提下,就是一个类使用extends 继承父类,其中继承的类具有父类...
2019-09-12 11:28:35
795
转载 漫谈:Java和Python现在都挺火,我应该怎么选?Java和Python优缺点比较。
声明:这是一篇容易引起撕逼的文章,为了祖国和谐,人民安康,请各位看官尽量理性讨论。同时,这篇文章是面向一些初入行的朋友进行一些相对中肯一点的分析和建议而已,虽然有浓厚的个人色彩,但我还是尽量以事实说话,以代码说话,大牛们就不要拿自己的牛逼经验来这里装逼了,当然,你如果非得来跟我撕,哥们儿我奉陪。另外,由于文中以自己所在的机构蜗牛学院所做的一些事情来举例,如果你认为这是软文广告,请止步于此。强哥打广...
2019-09-09 17:20:39
507
1
原创 Java编程思想之《一切都是对象》理解
前言《Java编程思想》中提到,Java是基于C++的,但相比之下,Java是一种"纯粹"的面向对象的程序设计语言。Java中不再使用指针来操作内存中的元素,而是采用对象的 “引用”【这个引用是作者提出的一种为了简化概念上的理解和C++语言的引用有着一些重大差异,望读者不必过于深究。】对象的理解使用引用来操作对象。Java中对一切对象的操作,都是通过对【对象的引用】的操作来实现的,...
2019-08-25 23:04:31
452
转载 Mysql分库分表,你需要看看这篇!
Mysql分库分表方案1.为什么要分表:当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。...
2019-08-25 13:39:38
537
原创 图解HashMap扩容和ArrayList的扩容机制。
前言众所周知,hashmap和Arraylist作为java中非常重要的一种数据结构,应用场景非常广泛,这篇文章主要针对HashMap和ArrayList的扩容机制进行分析。HashMap扩容机制分析在说HashMap扩容机制之前,有必要简述下HashMap的基本结构。以便各位更加清除的理解HashMap的底层是如何扩容的。HashMap自JDK1.8之后结构采用数组+单链表【单链表长度达到...
2019-08-22 22:54:44
6359
3
转载 过来人给Java初学者的建议!
给初学者之一:浅谈java及应用学java不知不觉也已经三年了从不知java为何物到现在一个小小的j2ee项目经理虽说不上此道高手,大概也算有点斤两了吧每次上网,泡b...
2019-08-22 13:08:48
1013
1
转载 Eclipse的Debug调试技巧指南!
一、Debug视图调试中最常用的窗口是:窗口说明Debug窗口主要显示当前线程方法调用栈, 以及代码行数(有调试信息的代码)断点Breakpoints窗口=> 断点列表窗口,可以方便增加断点,设置断点条件,删除断点等变量Variables窗口=> 显示当前方法的本地变量,非static方法,包含this应用,可以修改变量值代码编辑窗口=...
2019-08-22 12:03:02
379
转载 JDK1.8之 HashMap的红黑树结构、初始容量值16分析,你不可不知!
桶: 就是hashmap的table数组 bin: 就是挂在数组上的链表 TreeNode: 红黑树 capacity: table总容量 MIN_TREEIFY_CAPACITY :64 转化为红黑树table最...
2019-08-21 23:01:48
2046
转载 图解AVL树
AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图: 平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<...
2019-08-21 22:50:24
246
转载 剖析关系型数据库和NOSQL的本质,并没有孰优孰劣。
前言: 在大数据领域,被业界广泛谈及的CAP理论存在着一些关键性的认知误区,而只有全面地考察与分析分布式环境中的各种场景,我们才能真正正确地理解它。 目前,CAP(Consistency一致性、Availability可用性、Partition-tolerance分区可容忍性)理论普遍被当作是大数据技术的理论基础。同时,根据该理论,业界有一种非常流行、非常“专业”的认识,那就...
2019-08-21 22:37:03
222
转载 B树、B+树、LSM树以及其典型应用场景
前言动态查找树主要有:二叉查找树、平衡二叉树、红黑树、B树、B+树。前面三种是典型的二叉查找树,查找的时间复杂度是O(log2N)与树的深度有关系,那么降低树的深度也就可以提升查找效率。这时就提出了平衡多路查找树,也就是B树以及B+树。B树和B+树非常典型的场景就是用于关系型数据库的索引(MySQL)B树B树是一种平衡多路搜索树,B树与红黑树最大的不同在于,B树的结点可以有多个子女,从几...
2019-08-19 11:47:47
343
转载 Java NIO与Java IO
Java.nio与java.io之间有什么区别?它们分别用于哪些场景? 即优点和缺点。java io nio 区别和联系.IO &nb...
2019-08-17 21:51:08
193
转载 什么是NIO?NIO的原理是什么机制?
NIO和IO到底有什么区别?有什么关系?首先说一下核心区别:NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和...
2019-08-17 21:03:57
228
原创 浅拷贝和深拷贝的区别及js实现
前序几乎大部分语言中都有copy这样的函数或者是方法。用于对数据的复制操作。[其中数据类型数组,对象,等]。但是编程序的人,大部分在语言中都会有普通的拷贝方法和deepCopy方法。因此在这里做个叙述,用来介绍这两个方法的区别。浅拷贝浅拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然...
2019-08-15 22:49:41
596
原创 蒙特卡洛算法JavaScript实现
蒙特卡洛算法简述蒙特卡洛算法不是指某一种算法。是一种以概率统计为理论指导的一类数值计算的方法。是指使用随机数或者是伪随机数来解决很多问题的方法。蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果会趋向一种稳定的定律[也就是常说的偶然中存在某种必然],根据这个定律知道 样本数量越多,其平均就越趋近于真实值。关于蒙特卡洛的产生背景和其他相关信息。大家可以自行百度。有趣的游戏...
2019-08-13 20:38:27
865
2
原创 使用js原生方法和JQuery中ajax方法一次性上传多个文件
JavaScript原生方法实现。html片段<input type="file" name="file" id="FileUpload" multiple > //支持多文件选择上传<input type="button" value="上传" id="sub">js 代码://核心代码.第一个参数上FormData对象。第二个是上传文件表单对象。 ...
2019-08-06 18:53:26
3468
原创 JSONP解决跨域请求和JQuery中load()方法介绍
跨域与同源同源策略是浏览器的一种安全策略,所谓同源,是指该地址的协议、域名、端口都一样。默认情况下,只有同源的地址才可以通过AJAX方式请求。不同源之间的请求我们称为跨域请求。由于XMLHttpRequest无法发送不同源地址之间的请求。所以为了解决跨域请求的问题。我们使用JSONP这种方式来进行请求。JSONP介绍与实现原理分析: JSON with Padding,是一种借助于 &l...
2019-08-05 17:29:54
4103
原创 Ajax 介绍、JQuery中的Ajax常规使用
Ajax 介绍MDN给出的一个解释。Asynchronous(异步)JavaScript + XML,而不是技术本身,是2005年由Jesse JamesGarrett的术语,描述了一个“新”的方法一起使用的现有技术,包括HTML或XHTML、层叠样式表,JavaScript,文档对象模型,XML、XSLT,最重要的是XMLHttpRequest对象。当这些技术在Ajax模型中结合使用时...
2019-08-05 15:26:05
324
原创 JavaScript学习篇之内置对象介绍和使用。
前言web开发学习必须知道的网站: MDN 这里面有着详细的学习web开发的指南。关于web开发中遇到的不懂的,可以进这个网站进行检索。常用内置对象。1、常用的内置对象:Array:用于在单独的变量名中存储一系列的值Date:用于操作日期和时间String:用于支持对字符串的处理Math:用于执行常用的数学计算,它包含了若干个数字常量和函数2、Array数组对象var arr =...
2019-07-15 22:24:00
129
原创 JavaScript学习篇第二天
函数类型转换函数:数字型:parseInt(“d10d”); /转换失败 NAN 以字母开头的不可以转换但是以数字开头可以转换。/parseFloat(“3.222”) ; //转换为小数*/Number(9.5); /转换为数字/字符型:String(num)); //不严格,没有定义不会报错。num.toString()); //严格没有定义的会报错。布尔型...
2019-07-14 16:30:55
142
原创 JavaScript学习篇第一天
JavaScript 语言基础声明变量三种方式声明变量; var , let, const.其中var 用来声明 全局变量,let 用来声明变量只能在块级作用域内部有效。const用于声明变量为一个不可以修改的值。而且必须初始化,也就是要给个值,不然会报错。类似于JAVA中的 final 关键字。三种方式声明全局变量: 第一种: 使用var 声明。 第二种:不用声明,直接为隐式全局变量。...
2019-07-14 13:51:27
141
原创 前端学习html+css完结篇第十二天
css3中 3d变形transform先介绍这个之前引入一个新知识;由于这个参数是css3的样式,必然存在老版本浏览器不支持的情况。因此为了保证兼容之前的浏览器,于是就有了浏览器的前缀。浏览器的前缀 | 浏览器-webkit- | Google Chrome, Safari ,Android Browser-moz- | Firefox-o- | Opera-...
2019-07-09 16:54:24
181
4
原创 前端学习篇第十一天
制作ico图标第一步:获取或者是制作ico图标的图片。第二步:进入在线制作ico图片网站 网站在线制作ico图标。假设有一张图片。将其制作成图标。进入网站会出现以下界面,依次点击即可。于是就有了图标图标引入的代码:<link rel="shortcut icon" href="../ifavicon.ico" type="image/x-icon"> //其中这个...
2019-07-06 14:22:19
159
原创 前端学习基础第十天
css文件代码压缩一、安装node和npm(不做介绍,在我之前转载的博客中有)二、安装ckstyle npm install -g ckstyle三、安装ckstyle-serve(仅仅代码压缩可以不用安装这个) npm install -g ckstyle-serve使用介绍:压缩css文件命令:先把需要压缩的文件上传至linux系统中去 example: rz bas...
2019-07-04 14:11:51
208
转载 centos7安装node和npm
首先安装wget,用于下载nodeyum install -y wget在node官网查看node最新版本,使用wget下载node最新包<>wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz解压下载的node包,分别执行以下指令xz -d node-v10.13.0-linux-x64....
2019-07-03 16:33:36
3765
原创 前端学习基础第八天
引入图标字体字体图标的优点:体积更小,但携带的信息没有削减。支持所有的浏览器。可以随意改变颜色、产生阴影、透明效果等。移动端设备必备良药。最常用使用的两种图标字体: icomoon(德国)、icofont (国内)。引入图标字体步骤如下。第一步:先去官网下载自己需要的图标字体的压缩包,然后进行解压。将其添加至项目src目录下。第二步:引入图标字体(注意,这个本质是字体,因此占用的存...
2019-07-02 16:31:38
598
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人