自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CTO技术的博客

路漫漫其修远兮

  • 博客(172)
  • 收藏
  • 关注

原创 13. 大佬问我: notify()会立刻释放锁么?

大佬问我: notify()会立刻释放锁么?​我的内心戏: 肯定会啊! 这么简单的问题? 聪明如我, 决定装小白, 回答: 不会?大佬: 很好, 小伙子基础不错!我: 大佬: 说说为什么我: ………………于是, 有了这篇文章!问题的根本原来在于 “立刻”这个描述词!如果你和咸鱼君一样懵逼, 不妨往下看!技术大佬可以告辞了!!接下来, 我们深入的分析分析wait和notify前言前面介绍了Synchronized关键词的原理与优

2020-10-19 15:46:55 1253 1

原创 11. 嗨, 需要谈个对象…………?

嗨, 空闲时间, 谈个对象…………头?对不起, 咸鱼君又调皮了.今天, 我要和你谈的不是对象,而是对象头.没错, 就是Java对象里的对象头知识.(专业技术文, 阅读需谨慎)前言上章我们说了synchronized的基本原理, 了解到了synchronized的三种加锁方式方法锁类锁对象锁抱着往底层深挖的心态, 本章继续深入了解synchronized, 看看在底层, synchronized锁究竟是怎么实现的!为了说清synchronized锁的底层原理,我们得先

2020-09-15 09:52:23 133

原创 10. 谁再和我提内核/用户态, 我跟谁…………

前言谁再和我提内核/用户态, 我跟谁……记不清哪天了,咸鱼刚入职场,依稀记得某天的下午时光,公司内的一群大牛, 聚在一起    尽讨论一些高大上的技术话题, 或底层原理, 或架构……时不时传来一些专业术语“用户态”,“内核态”…………咸鱼在边上默默听着, 也不敢插嘴,   只能仰望大佬, 同时暗下决心,  今天一定要把这两个概念搞懂!那么, 用户态和内核态代表究竟是个啥?用户态和内核态简而言之

2020-09-01 13:45:14 136

原创 两个对象List根据属性取交集和差集及并集- 通用plus版

,发现很多小伙伴都有类似的需求, 刚好最近码哥有空了,就着手把之前的简陋方法封装下, 让它更通用些~比对方式可自己定义, 比如多个属性的比对, 老规矩, 给需要的伙伴一个简单的示例, 自行调整。

2023-08-31 15:04:22 710

原创 小白的GPT入门指南 - 工具篇

最近几个月,要问最火的是什么?无疑是GPT, IT行内行外,无人不知。码哥就来唠唠GPT的那些个事, 以及分享分享最近几个月实际使用下来的一些技巧。本章简单聊聊上手的方法.

2023-07-11 19:52:24 790

原创 小白的GPT入门指南 - 插件篇

GPT爆火小半年了, 早在AI赛道布局的各大厂商也是纷纷宣布产品上线度娘的 “文心一言”腾讯的 “HunYuan”阿里的 “通义”华为 的“盘古”码哥也简单的体验了下已发布的几款AI模型, 实话实讲, 目前还是GPT的更智能一点, 不过GPT需要折腾的问题对小白有点不友好.好在, 目前涌现了不少基于GPT包装后的产品, 所以今天码哥就来聊聊亲自使用过的几款免折腾AI工具.

2023-07-11 17:19:09 512

原创 小白的GPT入门指南 - 技巧篇

要想用好ChatGPT, 还是有一些技巧可以让我们是事半功倍的, 下面就列出常见的一些技巧和工具。

2023-06-26 16:36:04 537

原创 警惕, 差点着了副业骗局的道

码哥6.1亲身经历副业骗局, 好在及时反应过来, 没有被贪心蒙蔽, 希望大家在这样的环境下, 还是要警惕起来.(PS, 及时留言了公众号, 现在文章已撤回了)

2023-06-01 15:30:58 307

原创 摸鱼JVM - 垃圾收集

谈起JVM, 那么就不得不提垃圾收集(Garbage Collection 通常被称为“GC”).什么是垃圾收集呢?想解答这个问题, 我们最好将问题拆解开如何确定垃圾?如何回收垃圾?何时回收垃圾?下面围绕这三件事, 我们站在JVM层面梳理下垃圾收集的机制.

2022-10-18 14:59:50 299 1

原创 摸鱼JVM - 执行引擎

前面介绍过类加载器子系统运行时数据区(也就是内存相关)执行引擎前几章我们简单的梳理了一下JVM的类加载机制及运行时数据区,今天我们来聊聊JVM执行引擎.如无特殊说明, 所有描述JVM的特性均特指HotSpot VMHotSpot中采用的是解释器+JIT即时编译器混合.好处在Java程序运行时,JVM可以快速启动,前期先由解释器发挥作用,不需要等到编译器把所有字节码指令编译完之后才执行,这样可以省去很大一部分的编译时间;...

2022-08-18 15:26:51 386

原创 48. 从零开始学springboot: 接入RocketMQ

微服务的架构越来越流行, 很多老旧项目面临着解耦重构, 复杂项目的解耦通常会引入一些中间件来帮助我们更好的完成工作, 本章, 我们就来通过实例了解下消息中间件的用法.市面上比较流行的消息中间件如下因为鱼哥的项目上了阿里的云, 所以选择很简单, 就用RocketMQ即可, 看官们根据实际情况择优选择....

2022-08-11 16:10:10 2263

原创 47. 从零开始学springboot: spel结合redisson实现动态参数分布式锁

随着分布式服务的烂大街,不可避免的就是公共资源的争用问题,对开发来说,本质上就是如何限流加锁的问题.上章简单介绍了spel表达式的一些应用案例,本章则结合spel和redisson来实现一个分布式锁注解.Redisson是一个高级的、分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象.Redisson、Jedis、Lettuce是三个不同的操作Redis的客户端....

2022-07-29 14:54:37 318

原创 46. 从零开始学springboot: spel结合aop实现动态传参

基于SpingBoot框架中,我们随处可以见的便是各种各样的功能注解,注解的实现原理AOP之前有说过(翻看本系列的前面几章即可),这里不过多赘述.那么,你有没有碰到这样一种场景需要动态的传参数进注解,注意是动态的而不是写死在代码里的.针对这种需求,今天,我们就来实现一个简单的案例.正式撸代码之前,先了解下SpEl(SpringExpressionLanguage)表达式,这是Spring框架中的一个利器.//定义了一个表达式。...

2022-07-26 15:49:46 1235 2

原创 摸鱼JVM -运行时数据区

前面介绍过JVM被分为三个主要的子系统:前面我们介绍了JVM的类加载机制, 今天我们则重点聊聊JVM的运行时数据区, 即JVM内存相关知识关于JVM内存, 有两个比较重要的概念,这两个概念, 经常会有人搞混, 所以, 顺带来做个梳理.内存模型内存结构Java Memory Model, 就是我们常说的JMM;JMM和JVM内存结构不同, 它只是一个抽象的概念, 描述了一组规则或规范, 这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。我们知道, Java的多线程之间是通过共享内存进行通信的,而

2022-07-06 17:01:12 167

原创 摸鱼JVM - 类加载机制

我们知道, 在java开发中, .java文件会被编译超成一个个.class文件, 最终被JVM加载和运行.大致流程图如下我们写的java文件保存着业务逻辑代码,java编译器负责将 .java 文件编译成 .class 文件,.class 文件中保存着java文件转换后虚拟机将要执行的指令.当需要某个类的时候, java虚拟机会加载 .class 文件,并创建对应的class对象.将class文件加载到虚拟机的内存, 这个过程被称为类的加载.类加载的最终产品是位于堆区中的Class对象,Class对象封

2022-07-06 16:06:16 352

原创 摸鱼JVM - 几个常识概念启蒙 (老鸟请跳过)

JDK, JRE, JVM这几个概念很容易搞晕, 其实, 哪怕是JAVA老手也不一定能理清这些, 所以, 咸鱼还是简单的过下这几个概念.

2022-07-06 16:02:43 145

原创 45. 从零开始学springboot撸一个Xss过滤器-注解实现

前言上章通过Filter实现了Xss全局过滤器可能小伙伴还有点不满, 全局意味着“一刀切”,虽然我们也有白名单黑名单设置, 但是, 白名单黑名单针对的是整个方法或整个实体类举个例子, 我定义了个实体public class People { private String name; private String info; private String des;}可能业务上有限制(比如name限制了只有5个字符长),那么name其实不可能存在Xss注入风险了,程序

2021-08-26 14:11:57 316

原创 44. 从零开始学springboot撸一个Xss过滤器-Filter实现

前言项目安全需要, 需要全局对参数进行xss过滤处理.Xss简介关于Xss很多人可能都有了解, 出于“礼貌”,咸鱼君还是简单举个例子用户注册时可以填写姓名此时我填写了“” 并提交,后端呢没有做任何检测就保存了.那么就可能有问题, 下次再访问这个页面你会发现不停的弹窗“1”!Xss攻击呢也分很多种, 感兴趣的自行查阅资料, 这里不多说了.那么如何面对Xss攻击呢?其实也很好解决, 一句话“不要相信用户的任何输入”!编程上就是对用户的提交内容进行过滤以及非法字符的“转义”!Spring

2021-08-26 14:00:06 908

原创 一波反向操作, 我把几十个生产库给合了

前言近三个月没更新文章, 可不是我偷懒, 而是工作太忙,实在没有时间.时间回到三个月前, 领导突然找到我, 说要准备搞个“大工程”,一起讨论讨论.什么大工程呢? 简而言之, 合库!将几十个数据库合并成一个数据库!我想很多技术人和我一样, 第一反应就是: 啥, 合库?分库分表大多技术人或多或少都知道一些, 但是对于合库可能就没那么熟悉了.不过, 仔细一想, 这样的需求还是存在的, 比如游戏常见的“合区服”, 其实技术层面可能就是通过合库合表实现的.合库背景简介和相关项目组的人员聊了

2021-03-06 11:51:41 405

原创 43. 从零开始学springboot整合feign跨服务调用

介绍微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢?答案是肯定的,feign就提供了轻便的方式!如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,**feign + nacos**会帮你做剩余的事.如果没有注册中心, 也无需担心, feign一样可以以传统的ip:port方式进行调用~下面,我们来实践下吧springboot整合feign引入依赖, 这里

2020-11-02 10:23:42 584 1

原创 42. 从零开始学springboot整合alibaba-nacos做注册/配置中心

前言随着 服务化 的普及, 你会发现越来越多的公司开始服务化的调整, 那么有哪些变化呢?你会发现, 原来一个接口就实现了一套逻辑功能, 而服务化后, 服务拆分的维度更细了, 实现一个功能, 可能需要同时协同很多的服务接口!服务的拆分维度更细当然是有好处的, 服务间耦合度更低, 复用性更强, 但是随之而来的是服务间配置及管理成本的上升!所以, 为了解决这些服务治理成本, Nacos应运而生.Nacos 是阿里巴巴的开源项目,其核心定位是 动态服务发现、配置和服务管理平台简而言之 nacos两个功能

2020-10-13 15:34:37 429

原创 12. 面试官不问, 你也不得不知道的锁知识!

前言hello, 大家好, 我是咸鱼君, 擅长各种Java摸鱼姿势.恰逢2020年“金九”月,今天, 我们就来说一说面试中出现频率极高的锁知识!ps:说不定可以帮到部分有“想法”的同学锁的优化JDK6开始, synchronized的实现机制进行了较大调整,除了使用JDK5引进的CAS自旋之外, 还增加了以下的优化策略.自适应的CAS自旋锁消除锁粗化偏向锁轻量级锁…这些优化使得synchronized性能获得了极大提高, 所以, 情况允许下, 推荐使用synchronize

2020-09-25 09:44:13 209

原创 41. 从零开始学springboot整合ElasticSearch

Elastic介绍在2018年10月5日,一个做数据搜索服务的软件初创公司 Elastic,在纳斯达克上市。而我们所熟悉的 ElasticSearch,正是 Elastic 公司最出名的产品之一,其中还包括有分布式日志解决方案 ELK(Elastic Search、Logstash、Kibana)、Beats、ECE等。那 ElasticSearch 究竟是干啥的呢?本质其实是一个基于 Lucene 开发的搜索服务器,它提供了一个基于 RESTful web 接口的分布式多用户能力的全文搜索引擎,

2020-09-07 17:08:04 277

原创 别说我没提醒你……

前言别说我没提醒你, 明天, 是个特殊的日子.没错, 七夕节每年的这个时候, 广大男性同胞殚精竭虑有没有?!(无对象的请New一个)破财消灾不说, 主要还得需要点情商.送什么礼物合适呢?!耿直boy可能会直接问对方要什么在这里, 咸鱼君以多年的经验提醒:千万别问对方要什么礼物!!千万别问对方要什么礼物!!千万别问对方要什么礼物!!因为肯定会得到“我不要礼物”, “别浪费钱”, “只要你”类似的答案.要是你信了, 美滋滋的计划七夕“空手抱得美人归”对不起, 以后的日子你会

2020-08-24 13:53:08 186

原创 09. 小伙子, 听说你对synchronized理解很深?...

大佬: 你这段代码有线程安全问题, 解决下!我:      ……   大佬:      Synchronized加上,  别锁方法, 锁必要的代码块就好, 这样性能高点.我:        哦, 好的…………(ps, 迅速百度……)前言Synchronized(也叫同步)是

2020-08-14 17:11:27 164

原创 08. 今天, 小姐姐突然问了我一个问题……

前言今天,妹子突然找我,问了我一个问题……她要买笔记本电脑 (突然的失望……)她不是小白, 知道电脑要看内存, CPU,显卡以及固态硬盘等等甚至知道 N卡 和 A卡的区别但是依旧被CPU的“i5处理器 双核四线程”“i5处理器 双核双线程”……这些描述给整懵了…妹子知道我是“码农”,所以直接问我了“ CPU的双核双线程和双核4线程有啥什么区别? ”虽然我不明白“码农”为什么要知道这些……**不过, 巧了, 咸鱼君刚好知道!(差点不知道, 多影响形象!)那么, 在CPU

2020-08-06 10:07:28 431

原创 07. 就该这么学并发 - 上下文切换

前言前面的几章, 我们有提到个名词“上下文切换”这是个什么东西呢?其实很好理解, 我们看一本书籍时,往往间隔的看(很少有人一天看完的吧?!), 那么如何保证自己下次是从上一次断点处看呢? 显而易见, 我们用书签!“上下文切换”就是计算机的“书签”.本章,我们来学习“上下文切换”原理以及如何减少“上下文切换”.在此之前, 还得先复习下前面提到的进程和线程, 因为上下文切换的对象就是进程和线程.线程与进程进程是操作系统的管理单位,也是系统分配资源的基本单位;线程则是进程的管理单位, 也是是CP

2020-07-28 10:07:13 241

原创 06. 就该这么学并发 - 如何保证线程安全

前言上节,我们对线程安全有了较全面的认知.我们知道, 线程之所以不安全, 主要是多线程下对可变的共享资源的争用导致的.衡量线程是否安全, 主要从三个特性入手原子性可见效有序性只要保证了这三个特性,我们就认为线程是安全的, 多线程下执行结果才会和单线程执行结果统一起来.本章,我们就来聊聊**如何保证线程安全**的问题.如何保证原子性常用的保证Java操作原子性的工具是**锁和同步方法(或者同步代码块)**.我们举个例子:public class Test { privat

2020-07-16 10:20:18 385

原创 05. 就该这么学并发 - 线程安全

前言通过前几章对“线程生命周期”的讲解, 相信大家对于线程有了基本的了解.本章,我们就来聊聊**线程安全**问题.线程安全一般我们说到线程安全, 都是**针对多线程的(单线程不存在线程安全问题**)多线程之所以会出现安全问题, 主要是因为存在同时访问同一个共享、可变资源的情况这种资源可以是:一个变量、一个对象、一个文件等共享意味着该资源可以由多个线程同时访问可变意味着该资源可以在其生命周期内被修改简而言之,如果代码在多线程下执行和在单线程下执行永远都能获得一样的结果

2020-07-10 16:45:23 123

原创 一分钟,教你如何迅速定位OOM

如何迅速定位OOM某Java服务(假设PID=10765)出现了OOM,如何快速定位?OOM常见原因分析Java服务出现OOM,最常见的原因是:内存确实分配过小,内存确实不够用;某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽;某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接;更具体的,可以按照以下步骤,使用以下工具排查。OOM定位指南确认是不是内存本身就分配过小方法: jmap -heap 10765如上图,可以查

2020-07-01 10:16:00 1508

原创 我和媳妇吵了一架后.....

前言作为一个程序员(ps: 直男),生活上难免会和媳妇为一些小事吵个架,拌个嘴什么的(敢和媳妇吵架, 你怕是嫌活的久了……)(不过,你为啥会有媳妇???国家发的么?!)言归正传, 和媳妇吵架了, 怎么办呢?!此时, “直男癌” 晚期的我们, 不如尝试一点小套路~小套路毕竟,“自古真情留不住,唯有套路得人心!”咸鱼君尽心尽力的为“需要的小伙伴” (没媳妇的可以告辞了) 收集了十个小故事, 帮助你脱离“险境”!下面, 花上几分钟, 和咸鱼君一起修炼一下情商(

2020-06-29 15:49:35 233

原创 程序员撩妹指南-抖音爆火3D相册

前言最近,  妹子突然转发了一个抖音小视频如图,就是拿女朋友照片做了个酷炫的相册搞起好的, 我懂了,这不就是标准的 “你看看别人家的老公多浪漫的意思么?!!”.小编顿时不舒服了,这不就是很简单的H5做的么!同时暗自腹诽(写这个的是什么程序员!! 工作做完了么?饱和么?!!)吐槽归吐槽,该做的还得做,毕竟,保命要紧!于是,小编花了几分钟“写”完,效果如下!效果(别想了,这么美的妹子不是小编的!!)当然, 老婆才是最美的!编码代码很简单,就一些css加一

2020-06-29 15:48:40 543

原创 04. 就该这么学并发 - 线程的结束

前言接上章“线程的阻塞”,我们继续讲线程的生命周期中最后一个状态“销毁”销毁(Dead)线程会以如下3种方式结束,结束后就处于死亡状态:- run()或call()方法执行完成,线程正常结束- 线程抛出一个未捕获的Exception或Error- 直接调用该线程stop()(已废弃,不推荐使用)方法来结束该线程, 该方法容易导致死锁,通常不推荐使用线程一旦死亡,就不能复生.如果在一个死去的线程上调用**start()**方法,会抛出java.lang.IllegalThreadS

2020-06-29 14:57:51 158

原创 03. 就该这么学并发 - 线程的阻塞

前言上章介绍了**线程生命周期的就绪和运行**状态这章讲下线程生命周期中最复杂的**阻塞**状态阻塞(Blocked)在开始之前我们先**科普**几个概念阻塞,挂起,睡眠 区分阻塞在线程执行时,所需要的资源不能立马得到,则线程被“阻塞”,直到满足条件则会继续执行阻塞是一种“被动”的状态挂起线程执行时,因为“主观”需要,需要暂停执行当前的线程,此时需要“挂起”当前线程.挂起是“主动”的动作行为,因为是“主动”的,所以“挂起”的线程需要“唤醒”才能继续执行睡眠线程执行时,因为“主

2020-06-16 10:05:31 234

原创 40. 从零开始学springboot-再谈参数合法性验证

​一、介绍关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证以外,后端依然还需要进行验证,以防不合规的数据直接进入后端,严重的甚至会造成系统直接崩溃!本文结合自己在项目中的实际使用经验,主要以实用为主,对数据合法性验证做一次总结,不了解的朋友可以学习一下,同时可以立马实践到项目上去。下面我们通过几个示例来演示如何判断参数是否合法,不多说直接开撸!二、断言验证对于参数的合法性验证,最初的做法比较简单,自定义一个异常类。public class CommonExc

2020-06-09 16:02:17 481

原创 02. 就该这么学并发 - 线程的就绪与执行

前言接上章“线程的创建”, 本章我们聊聊线程生命周期的“就绪”和“运行”状态.就绪(Runnable)线程对象的start()方法被调用后,该线程即进入就绪状态- 此时JVM会为其创建方法调用栈和程序计数器;- 该状态的线程一直处于"线程就绪队列" 尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列, 因为CPU的调度不一定是按照先进先出的顺序来调度的- 此时线程等待系统为其分配CPU时间片,并不是说执行了start()方法就立即执行简而言之,假设有子线程t, 那么

2020-06-09 16:01:01 164

原创 暗藏杀机? 不简单的三目运算符号!

最近,在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE (Null Pointer Exception)的问题。重构代码非常简单,代码如下:// 方法返回参数类型为 Integer//  private Integer code;SimpleObj simpleObj = new SimpleObj();// 其他业务逻辑if (simpleO

2020-06-03 11:06:33 315

原创 IP 如何存储?

前几天,一个朋友去面试,他回来告诉我,面试官问他: IP 地址是怎么存在数据库的?他当时也没多想,直接就回答: 存字符串啊心想:这么简单的问题,怕不是看不起我吧IP地址 本来就是一个字符串,存放在数据库作为字符穿类型,也是无可厚非的。但是,换位思考,站在面试官的角度,你觉得我会问这么一个低级的问题么?那么答案当然是否定的。所以,面试官想知道的是你对这个问题会不会有深度思考,从此来一定程度的判断你在平常的开发中只是一个单纯的 “搬砖” 的码农,还是一个有灵魂的 Coder 。序言针对这个问题

2020-06-03 11:04:18 2252

原创 01. 就该这么学并发 - 线程的创建(多姿势)

本章开始,咸鱼君将开启一个新的专栏 就该这么学并发 来记录学习Java并发编程的相关内容~前言说到**并发编程,就不得不先说多线程,因为并发的本质就是多线程的处理**进程和线程进程 (ps: 每一个程序就是一个进程)进程指运行中的应用程序,每个程序运行时就会开启一个进程进程是系统分配资源的最小单位进程有独立系统资源(进程间的资源是隔离的)每个进程至少有一个线程- 线程 (ps: 进程至少有一个线程)线程依托于进程线程除了支持本身运行的一点系统资源外(如: 控制线程运

2020-06-03 11:00:43 257 1

原创 39. 从零开始学springboot-好用的开源工具类

前言不过最近 Review 代码的时候,咸鱼君发现之前的有些代码有些繁琐,现在看来, 可以用一些开源工具类实现,不需要自己重复实现。所以,这里就分享几个常用的工具类,希望帮助到刚入行的同学们。其他编程老司机如果还有其他好用的工具类,欢迎评论区分享。下文主要分享这几个方向的常用工具类:字符串相关工具类Java 中 String 应该是日常用的最多一个类吧,平常我们很多代码需要围绕 String ,做一些处理。JDK 提供 String API 虽然比较多,但是功能比较基础,通常我们需要结合 S

2020-05-28 10:33:41 411

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除