
源码之美
通过学习源码,记录学习到的点点滴滴,以备复习用
帅到被人砍啊
发表的文章都是个人的小总结未必全对如果有疑问请大虾们多多指教啊
展开
-
java.lang.InheritableThreadLocal
ThreadLocal是一个线程局部变量类,他是跟当前线程绑定的,线程与线程之间是相互不影响的。也就是在一个线程中通过ThreadLocal进行set值之后,其他线程get是get不到的,只能自己线程进行get。 但是有时候我们想主线程set值,子线程都能取到,这样的话,ThreadLocal就不适用了。幸好java提供了一个类InheritableThreadLocal,它继承自ThreadLocal, 而且Thread类中也定义了相关的变量,使得这个场景得以实现。直接上测试代码了:static原创 2020-08-20 18:05:55 · 163 阅读 · 0 评论 -
使用redis分布式锁实现一个秒杀业务
无论是秒杀还是其他的减库存业务,一个最基本的原则就是不能超卖和少卖。物品的库存都在一个篮子里,要想不超卖,就必须得加锁控制,而对于分布式系统中,使用redis实现分布式锁也不是什么新鲜事物了。但是控制不好,即便使用redis进行分布式锁的话也有可能在高并发的情况下出现问题,比如超卖、redis连接不上等在这里使用原生的Jedis和RedisTemplate分别写了两个简单的示例,模拟300并发下,抢100个库存物品。在此之前先说一下我工程的maven环境,有时候jar包版本不一样也会产生不一样的原创 2020-08-06 18:24:27 · 573 阅读 · 0 评论 -
java.lang.Class
Class是用来表示java运行时,类或者接口的类对象。有点拗口,有点像人是地球上你我他的称呼。你是人,我是人,他也是人^_^。 因此枚举、注解、数组、java基本类型、void关键字,都是一种类。Class是没有公共构造函数,因此不能对其进行普通的实例化(new),其实例化是由java虚拟机在进行类装载的时候,由类加载器调用defineClass方法进行构造的。Class对象是我们在使用java反射时,常常使用到的对象。常用的方法:forName(String className)原创 2020-07-31 17:50:55 · 162 阅读 · 0 评论 -
java.util.Stack
Stack是栈,符合LIFO(last in first out)原则。所以对于类似执行了一连串的命令,然后需要撤销的这种场景,使用它比较合适。Stack集成Vector,所以用法跟Vector和List等集合类似。Stack有些独有的方法:empty() : 检查Stack集合是否是空了,空的话返回true,否则返回false;peek() : 返回Stack集合里最顶端的对象,也就是最后加入到集合中的对象。pop() : 返回Stack集合里面最顶端的对象,并将该对象从集合...原创 2020-07-28 19:04:22 · 357 阅读 · 0 评论 -
mqtt的messageId是怎么回事
昨天去巡检线上环境的时候,偶然发现了某个服务报了一个错误,而且是每隔90秒报一次,错误信息如下:意思是内部错误,没有新的messageid可以使用了。消息队列就不多说了。正常的情况就是一个消息会有一个消息id,如果不了解mqtt的消息id的话,我们正常人的思维就是这个消息id是个随机数,因为消息的id是int类型,所以最大值是2^31-1,大概是21亿,对于一个庞大的系统而且是持续运行的系统,消息肯定会满天飞,数量级可能是百亿甚至千亿,那这个id能装得下么。结合着这个疑问和这个报错,捋了一下这块原创 2020-06-19 20:50:45 · 8314 阅读 · 1 评论 -
java.lang.Object
万物皆对象。Object类是类层级结构的根, 是所有类的超类。所有的对象都要实现其中的方法。Object类有十几个方法,除了toString(), equals(), finalize()三个方法外,其他的方法全是native方法,即在C代码中实现的的方法。Object中的所有方法,除了registerNatives()方法是私有的,其他的方法都可以被子类重写。1、toString()方法:public String toString() { return getClass().g原创 2020-06-16 18:10:37 · 283 阅读 · 0 评论 -
CyclicBarrier && CountDownLatch
今天写一下这两个类的自己所得吧。CyclicBarrier(循环屏障):底层使用的ReetrantLock、LockSupport、AQS、CAS等技术。使用的含义就是设置指定数量的屏障(通过构造函数赋值),通过await()方法让线程卡在屏障处,实现线程阻塞,阻挡当前线程后续的操作, 当多个线程调用await()方法的个数达到设定的屏障数时,所有的线程都会被唤醒。线程的阻塞和唤醒使用的LockSupport的park和unpark方法,因为unpark方法可以指定线程进行唤醒。之所以称原创 2020-06-10 17:52:56 · 105 阅读 · 1 评论 -
2、Annotation的实现
说到Annotation的实现,先来看个示例:定义自定义注解:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @ interface MyAnnotation { int value() default 0;}测试自定义注解:@MyAnnotation(value=1)public class TestAnnotation { public static原创 2020-06-09 16:29:06 · 824 阅读 · 0 评论 -
1、Annotation
java.lang包有很多类及子包,因为java.lang.annotation中的类少,简单,所以就先看了下这个包。看源码有两大工具:API 和JLS,另外看源码一定要看注释,这一点非常非常重要。API:https://docs.oracle.com/javase/8/docs/api/JLS:https://docs.oracle.com/javase/specs/我用的是jdk1.8的两个文档。Annotation的第一行注释就是The common interface exten原创 2020-06-09 11:28:59 · 181 阅读 · 0 评论 -
根据参数值的不同,调用不同实现类
最近的业务跟口碑关联比较紧密,为了支持客户定制化的要求,有些内容留了扩展口,口碑的团队同学帮我们定义了一些模板类,然后通过实现类传入不同的参数实现不同的功能。其底层的实现源码没有看过,但是类似的功能在dubbo里面也有很多。实际上也是一种钩子方法。出于兴趣,自己根据需求实现了个简单的功能:传入"cat"实现猫叫, 传入"dog"实现狗叫。在此贴一下源码:1、先创建一个抽象的模板类,子类通过实现抽象的方法,并且子类对象调用doSpeak方法,即可实现子类的不同功能。实现类的命名要求必须是传入参数名原创 2020-06-09 10:45:15 · 5725 阅读 · 0 评论 -
前言
为什么要建立这个专栏?我们大部分程序员日常工作中都被大量的CRUD操作占据了我们大部分时间,也很难有时间和精力去研究下有些代码背后的逻辑及底层的实现是什么。作为程序员,我目前能感受到的是35岁一定是个坎,要么你35岁成为大牛,要么你35岁你在某个公司已经立足为老员工,要么35岁你就到处碰壁了。35岁跟二十四五岁的年轻程序员比,拼不过他们的体力和精力,唯一能拼的就是你的知识储备以及业务储备,如果两者都没有,那真的很危险,过了35岁,可能就只能转岗、转行、摆地摊了。业务储备就不说了,基本上在一个公司带不原创 2020-06-08 11:35:45 · 120 阅读 · 0 评论