- 博客(15)
- 收藏
- 关注
原创 Spring IOC仿写,实现基于配置文件和注解注入,超级详细
前言本篇文章是基于上次对Spring IOC和AOP的仿写扩展的,最好先看一下之前的那篇文章:仿写Spring IOC和AOP,仿写思路和代码讲解上次仿写的IOC是基于配置文件实现注入的,这次拓展了基于注解的注入,同时调整了实现IOC的整体架构,改动的地方还是很多的,所以我会重新讲解实现IOC的整体思路和代码实现整体思路先来说一下整体的设计思路:首先要对配置文件进行扫描如果扫描到了<component-scan base-package="com.pojo"/>,说明开启了对注解的
2022-03-30 00:22:51
616
原创 dubbo-admin2.7一步一步配置安装流程,很详细
Zookeeper首先去Zookeeper的官网上下载Zookeeper:Zookeeper官网我这里下载的是3.7的,上面描述了3.7是最新的稳定版下载后解压得到apache-zookeeper-3.7.0-bin文件夹,在bin目录下使用cmd运行zkServer.cmd,这个就是zookeeper的服务端zkServer.cmd发现报错了,报错的原因是没有zoo.cfg配置文件,这个文件在根目录下的conf文件夹下,可以看到有一个zoo.sample.cfg文件,这个文件就是配置文件
2022-03-24 17:06:59
2840
3
原创 打包时出现Downloading https://...to
这种情况就是文件下载不下来,我们可以手动下载先把前面的链接复制下来https://nodejs.org/dist/v9.11.1/node-v9.11.1-win-x64.zip 放到浏览器中,跳转后应该就会自动开始下载这个文件复制后面那个地址,去资源管理器中找一下,可以发现这个文件确实没有下载下来,是0KB我们把刚才下载的那个文件复制到这里删除没有下载好的那个,把自己下载那个文件的名字修改一下,这样就好了再次执行打包命令应该也不会报这个错误了...
2022-03-24 16:28:00
1246
原创 线程的状态有哪些,怎样流转的
新建状态:创建一个线程时的状态就绪状态:新建的线程不自动开始运行,需要调用start方法,调用之后即启动了线程,进入就绪状态运行状态:当线程获得cpu时间片后,进入运行状态,开始执行run方法阻塞状态:线程还没有结束,暂时让出cpu给其他线程,情况如下通过调用sleep方法调用一个在i/o上被阻塞的操作试图获得一个锁,但是该锁正被其他线程持有着等待某个触发条件死亡状态:run方法执行完退出线程自然死亡一个未捕获的异常终止了run方法使线程突然死亡...
2022-03-22 21:38:51
230
原创 synchronized与ReentrantLock的区别
Synchronized的实现设计锁升级,无锁 偏向锁 轻量级锁 重量级锁,ReentrantLock的实现利用cas保证线程操作原子性和volatile保证可见性Synchronized不需要用户手动释放锁,代码执行完后会自动释放,ReentrantLock需要手动释放,否则可能会导致死锁Synchronized是不可中断类型的锁,ReentrantLock可以中断,通过trylock设置过期时间或者使用interrupt方法来中断Synchronized是非公平锁,ReentrantLock可以.
2022-03-22 21:31:53
147
原创 乐观锁与悲观锁讲解,CAS、synchronized、锁升级、ReentrantLock、AQS
什么是乐观锁和悲观锁乐观锁:总是假设最好的情况,每次拿数据的是时候都认为别人没有进行修改,所以不会加锁,但是为了保证线程安全,每次修改的时候都会判断这个数据有没有被修改过,适用于写少的场景,因为在写操作较多时如果失败会不断通过自旋判断数据有没有被修改,十分消耗CPU资源,CAS是实现乐观锁的一种方式,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。悲观锁:总是假设最坏的情况,每次拿数据的时候都认为别人会修改数据,所以每次
2022-03-22 14:07:38
1456
原创 ConcurrentHashMap讲解
什么是ConcurrentHashMapConcurrentHashMap是线程安全且高效的HashMap为什么要使用ConcurrentHashMapHashMap可能导致程序死循环线程安全的HashTable效率非常低下线程不安全的HashMap下面代码使用HashMap进行put操作会引发死循环,CPU利用率接近100%,所以不能使用HashMap final HashMap<String, String> map = new HashMap<String, Str
2022-03-21 23:05:55
2924
原创 浏览器中输入URL后发生了什么
解析URL解析应用层协议类型,比如http、https、ftp等解析域主机,比如http默认是www解析域名,比如baidu.com解析主机端口,比如http默认是80端口,https默认是443解析资源路径,就是第一个/后面的东西解析资源名,就是最后一个/后面的东西查询DNS浏览器不能直接通过域名找到对应的服务器,只能通过ip地址,所以要根据域名去查询ip地址,一般会通过浏览器缓存、操作系统缓存、路由缓存等查询TCP/IP的连接与断开共有四层,再发生方那里,每一层都会加上一个头部再
2022-03-21 18:18:01
3043
原创 仿写Spring IOC和AOP,仿写思路和代码讲解
前言因为自己在反射和代理这方面用的不多,所以掌握的不太好,正好在看spring的ioc和aop,这两个机制多多少少都用到了反射,尤其是aop,还用到了代理模式,所以借此机会简单仿写一下spring的ioc和aop,花了两天时间终于做好了,思路我觉得还是比较清晰的,记录在这里吧IOC仿写说明一下,我只仿写了通过配置文件注入的方式,注解的方式等以后我可以也会做出来如果不太清楚IOC的朋友可以看我写的另外一篇博客:IOC讲解首先理清一下思路:肯定要有个实体类,通过配置文件的bean标签和proper
2022-03-20 23:31:18
665
原创 仿写HashMap,思路清晰
最近在看HashMap的源码,了解了HashMap的原理和方法实现的过程,觉得如果自己仿写可以简单仿写一个HashMap可能就会更加清楚了,说干就干。说明一下,自己只仿写了put和get方法,其他方法其实大致原理差不多。首先,HashMap的底层是一个数组,数组中的元素Node有四个属性,Key,Value,Key的Hash值和为了解决产生Hash冲突而设置的Next结点,如下:class Node<K,V>{ K key; V value; int hash;
2022-03-19 13:51:21
762
原创 链表相交(Java)
思路:设A链表长度为a,B链表长度为b,两个链表的交集长度为c,那么从A链表头结点开始,走完自己一遍之后,再走B链表,走到相交结点,需要的步数为a + (b - c),同样,对于B链表,从头结点开始,走完自己一遍,再走A链表,走到相交结点,需要的步数为b + (a - c),可以发现,a + (b - c) = b + (a - c),所以,让他们同时开始走,如果有相交结点,总会相遇的,而相遇时共同指向的那个结点就是相交结点,如果没有相交结点,那他们就会把两个链表都走完,最终全是null,两种情况最后只.
2022-03-12 14:33:10
1304
原创 Java观察者模式讲解及代码实现
概念观察者模式又叫做发布-订阅模式,是对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新组成抽象主题角色(Subject)也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现抽象观察者角色(Observer)包含了一个更新的抽象方法,当收到具体主题的更新通知后调用,由抽象类或接口实现具体主题角色(Concrete Subject)也叫具体目标类,实现抽象目标类的通知方法,当具
2022-03-03 17:11:34
4823
原创 Java单例模式讲解和实现及相关问题总结
特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。懒汉式单例在第一次调用getInstance方法的时候实例化public class Singleton { public static Singleton singleton = null; private Singleton() { } public static Singleton getInstance(){ if (singleton
2022-03-02 23:47:54
598
原创 Java的三种工厂模式
场景:一家饭店菜单上有两种饭,分别是黄焖鸡米饭和河北正宗安徽牛肉板面,顾客点餐我们要做出顾客选的那种饭首先肯定是有一个接口Cook,cook方法表示做饭public interface Cook { void cook();}创建两个类来实现Cook接口public class CookMi implements Cook{ @Override public void cook() { System.out.println("黄焖鸡米饭"); }
2022-03-01 19:57:48
943
原创 如何保证MQ消息队列的可靠性传输
MQ的基本原则:数据不能多一条,也不能少一条,不能多,就是要保证幂等性,不能少,就是要保证可靠性,数据不能发生丢失RabbitMQ生产者丢失数据可能在生产者向RabbitMQ发送消息的中途发生数据丢失第一种方法是使用RabbitMQ提供的事务机制,在生产者发送数据之前开启RabbitMQ 事务channel.txSelect,然后发送消息,如果该消息没有接收到,就会发生异常,然后执行回滚事务channel.txRollback,然后重新发送消息即可,如果收到了消息,就执行提交事务channel.tx
2022-03-01 10:15:23
740
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人