- 博客(97)
- 收藏
- 关注
原创 LinkedHashSet集合
3.在添加一个元素时,先求hash值,再求索引,确定该元素table的索引位置,然后将元素添加到双向链表中(如果已经存在,则不可添加,等同hashset)因为linkedHashSet继承自HashSet,固扩容机制等同与HashSet等同与HashMap。1.在LinkedHashSet中维护了一个hash表和双向链表,且含有head和tail。2.表中的每个节点都有before和after属性,这样可以形成双向链表。属性,索引每个节点都有序链接,即形成了有序的双向链表结构。
2024-07-17 17:21:27
241
原创 HashSet集合
由于每个结点的 hash 是未知的,我们不知道 hash 的第 5 位是 0 还是 1,所以扩容后每个结点的新索引都有可能发生变化,我们需要一个结点一个结点的判断。怎样使用,完全由我们来控制,如果重写了equals就是比较对象的值,如果没有重写equals就是比较的对象的地址值。就算链表上的结点到达了 8 个,但此时数组长度小于 64,是不会将其转为红黑树的,而是进行一次扩容。数组的每个索引位置默认存放的是单向链表,如果链表的长度到达了一个临界值就会转为红黑树。如果这个表中的索引对应的元素已存在。
2024-07-17 16:49:27
749
原创 Spring学习⑤__Spring AOP的高级应用
。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户 程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。(要么成功,要么失败)一致性(consistency):事务必须是使数据库从一个一致性
2024-05-22 17:06:33
420
2
原创 Spring学习④__Spring AOP介绍与使用
面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,虽然IOC容器没有依赖AOP,但是AOP提供了非常强大的功能,用来对IOC做补充。通俗点说的话就是在程序运行期间,将某段代码动态切入到指定方法的指定位置进行运行的这种编程方式。
2024-05-14 17:34:13
1032
原创 Spring学习①__Spring初识
Spring:翻译为春天的意思------>给软件行业带来了春天!2002,首次推出了Spring框架的雏形:interface21框架!Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。成就:Spring Framework创始人学历:悉尼大学的博士专业:音乐学Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
2024-05-14 17:34:00
1008
原创 Spring底层如何执行?
此实现执行此上下文的底层 BeanFactory 的实际刷新操作,(如果有)关闭先前的 BeanFactory,并为上下文的生命周期的下一个阶段初始化一个新的 BeanFactory。执行后,这里可以看到我们加载的xml的BeanDefinition信息提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2024-04-16 15:04:20
786
1
原创 BeanDefinition
工作的 bean 工厂、资源加载器、用于加载 bean 类的类加载器、环境等XmlBeanDefinitionReader:读取 XML 文件定义的 BeanDefinitionPropertiesBeanDefinitionReader:可以从属性文件,Resource,Property 对象等读取 BeanDefinitionGroovyBeanDefinitionReader:可以读取 Groovy 语言定义的 Bean。
2024-04-01 20:24:31
720
原创 Spring源码基础解析
现在占位符还存在调用invokeBeanFactoryPostProcessors 占位符已经替换了自己扩展,实现BeanFactoryPostProcessor,在创建对象前修改bean的定义信息BeanDefinition。
2024-04-01 20:22:34
584
原创 十七、LockSupport
上面这段代码的意思是,我们定义一个线程,但是在内部进行了park,因此需要unpark才能唤醒继续执行,不过上面,我们在MyThread进行的park,在main线程进行的unpark。现在我们知道了LockSupport是用来阻塞和唤醒线程的,而且之前相信我们都知道wait/notify也是用来阻塞和唤醒线程的,那么它相比,LockSupport有什么优点呢?这个就需要仔细的观察了。LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。
2024-03-22 21:50:12
293
原创 软技能学习
例如:我上家公司工作太严谨了,每次功能开发都要测试好多遍,别人总是催着我强迫着我,给整个团队上延迟交付,忽略了团队上的沟通,然后说自己如何修改缺点,现在已经没有缺点了等等。例如:我这个人做事有点强迫症,当一个功能做完,我会反复的确认几遍,虽然我在公司不是做的最快的,但是是bug率最低的。如果手里面有几个offer,你就是我很看重贵公司的offer,如果能给我offer,我会拒掉其他公司的offer。【要求:有正面的说,不要说不能加班,不要说工作效率低,也不要说我最大的缺点就是优点等等】谈谈培训课程的内容。
2024-03-20 10:07:25
753
原创 十五、ReentrantLock
当线程位于一个线程队列里面,当又有一个新的线程来的时候,他会检查队列里面有没有原来内容,如果不公平,这个线程上来就抢是有可能抢到的,如果是公平锁,这个线程会先检查这个线程里面有没有原来等着的,队列里如果有,它先进队列等着,等别人先去运行,队列里如果没有,我先来。:在非公平锁模式下,线程尝试获取锁时会直接尝试获取,不考虑等待队列中是否有等待的线程。:在公平锁模式下,线程会按照先来先服务的顺序获取锁。当一个线程尝试获取锁时,如果锁已经被其他线程持有,该线程会被放入等待队列中,按照先后顺序等待获取锁。
2024-03-18 23:11:14
772
原创 十四、ReadWriteLock
同时,2 个写线程需要依次获取写锁执行写操作,每个写线程也需要 1 秒执行完毕。根据代码逻辑,18 个读线程并发执行,每个读线程需要 1 秒执行完毕,因为读操作是并发执行的,所以整体读操作的时间是 1 秒。目前有 18 个线程执行读操作,每个读操作需要 1 秒钟执行,同时有 2 个线程执行写操作,每个写操作也需要 1 秒钟执行。,写线程总共需要 2 秒(1 秒执行写操作,1 秒等待另一个写线程执行完毕),所以整个程序执行的时间大约是 2 秒左右。换成读写锁的时候,读线程是读锁,写线程是写锁,写锁是排他的。
2024-03-18 22:29:21
324
原创 十三、Phaser
onAdvance(int phase, int registeredParties) 当前阶段,参与人phaser.arriveAndAwaitAdvance();Phaser 阶段, 不同的阶段。例如:现在一个结婚场景分为4个阶段。每个线程走向对应的阶段就结束。
2024-03-18 22:01:06
184
原创 十、锁的底层实现
自旋锁有个特点,它占CPU但是它不访问操作系统,它是在用户态去解决问题,不经过内核态。因此它在加锁解锁上效率要比内核态高。重量级锁OS不占CPU进入到等待队列的线程,什么CPU开始运行分配时间片。JDK早期的锁都是重量级的锁,都需要找操作系统去申请锁,效率低。什么情况下使用自旋锁比较好?
2024-03-18 21:01:44
378
原创 八、CAS (无锁优化)
我们知道Unsafe类是rt.jar包提供的,rt.jar包里面的类是使用Bootstrap类加载器加载的,所以在main函数中加载Unsafe类的时候,根据委托机制,会委托给Bootstrap去加载Unsafe类。现在我期望这个值为3,期望的值为3的时候我在自增改为4,在改的过程当中发现已经变为4的话,和我期望的值对不上了说明有另外一个线程改了这个值,这个时候CAS就在重新再试一遍,在试的时候我期望这个值为4,如果为4,把他改为5。1. 先把0读到自己的线程内存里面来读完之后,改为1。
2024-03-18 20:40:55
679
原创 java面试题
什么是Object有哪些常用的方法?toString(): 返回对象的字符串表示形式。: 比较对象是否相等。hashCode(): 返回对象的哈希码值。getClass(): 返回对象的运行时类。clone(): 创建并返回对象的一个副本。finalize(): 在对象被垃圾回收器回收之前调用。notify(): 唤醒在对象上等待的单个线程。: 唤醒在对象上等待的所有线程。wait(): 导致当前线程等待,直到其他线程调用notify()或方法唤醒。: 导致当前线程等待指定的毫秒数。
2024-03-06 22:12:52
851
原创 nginx
Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:PaM6nep)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx1.0.4发布。其特点是占有内存少 1M并发能力强 支持5万并发响应。
2024-03-06 13:55:09
741
原创 RocketMQ的应用
顺序消息指的是,严格按照消息的发送顺序进行消费的消息。默认情况下生产者会把消息以Round Robin轮询方式发送到不同的Queue分区队列中;而消费消息时会从多个Queue上拉取消息,这种情况下的发送和消费不能保证顺序的。如果将消息仅发送到同一Queue中,消费时也只从这个Queue上拉取消息,就严格保证了消息的顺序性。
2024-03-03 00:03:50
83
原创 Offset管理
可以继续读取并消费下一批消息。注意,该计算的数值是理想i情况下的理论数值,在生产环境中,不建议直接使用,而是根据当前环境,先设置一个比该值小的数值然后观察其压测效果,然后再根据效果逐步调大线程数,直到找到该环境中性能最佳时的值。消息是被顺序存储在commitlog文件的,且消息大小不定长,所以消息的清理是不可能以消息为单位进行清理的,而是以commitlog文件为单位进行清理的。Consumer将本地缓存的消息提交到消息线程中,使用业务消费逻辑对消息进行处理,处理完毕后获取到一个结果。
2024-03-02 23:30:57
1106
原创 RocketMQ工作原理_消息的消费
然而默认消费下,offset是异步提交的,这个异步行导致提交到Broker的offset与Consumer实际消费的消息的不一致。例如:异步消费过程中,在第500条突然插进来Consumer2,但是Consumer1已经把500后面的queue的100条进行消费,但是Consumer2插入的时机是500条,这时候出现Rebalance,会出现消息的重复消费。,即Consumer向其关联的Queue注册了监听器,一旦发现有新的消息到来就会触发回调的执行,回调方法是Consumer取Queue拉取消息。
2024-03-02 21:39:28
1564
原创 集群搭建理论
理论上讲,一个由n块磁盘组成的RAID0,它的读写性能是单个磁盘性能的n倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。数据校验技术相对于镜像技术的优势在于节省大量开销,但由于每次数据读写都要进行大量的校验运算,对计算机的运算速度要求很高,且必须使用硬件RAID控制器。镜像技术提供了非常高的数据安全性,其代价也是非常昂贵的,需要至少双倍的存储空间。三种技术来获取高性能、可靠性、容错能力和扩展性,根据对这三种技术的使用策略和组合架构,可以把RAID分为不同的等级,以满足不同数据应用的需求。
2024-02-29 22:16:03
1044
原创 第2章RocketMQ的安装与启动
一、基本概念1. 消息(Message)消息(一条数据object)是指,消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。2. 主题(Topic)Topic表示一类消息的集合每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。一对多一个生产者可以同时发送多种Topic的消息;而一个消费者只对某种特定的Topic感兴趣,即只可以订阅和消费一种Topic的消息。
2024-02-29 11:02:27
1138
原创 OpenFeign
前面我们远程调用服务是使用的Ribbon(负载均衡)+RestTemplate(远程调用)时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。
2024-02-23 22:48:34
706
原创 Ribbon负载均衡
通过源码可以看到,这里直接调用了delegate.apply(input),也就是直接使用了主过滤类ZoneAvoidancePredicate的apply方法,获取到可用的服务列表后,在依次调用次过滤类(次过滤类可以是多个,CompositePredicate里只有一个AvailabilityPredicate)的getEligibleServers方法进行过滤。同时我们可以发现,如果没有选择到Server的话,就会调用父类的choose方法,那么就会使用到上面说的 “
2024-02-20 23:51:47
1104
原创 三个注册中心的异同
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求。当网络分区出现后,为了保证可用性,就必须使用B的数据,否则无法保证可用。当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性。结论:违背了A与B的数据一致性要求,只满足可用性和分区容错,即CP。结论:违背了可用性A的要求,只满足一致性和分区容错,即CP。CAP理论关注粒度是数据,而不是整体系统设计的。
2024-02-20 19:22:15
300
原创 Consul服务注册与发现
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
2024-02-20 11:21:03
819
原创 Zookeeper服务注册与发现
现有的关于eureka2.0的开源工作已经停止。作为2.x分支上现有工作存储库的一部分发布的代码库和工件被视为使用风险自负。Eureka 1.x是Netflix服务发现系统的核心部分,目前仍是一个活跃的项目。SpringCloud整合Zookeeper代替Eureka?Eureka停止更新了你怎么办?
2024-02-19 14:33:08
2182
原创 Enreka服务注册与发现
Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务治理。在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2024-02-18 21:47:02
1103
原创 订单微服务模块
提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模版类,是Spring提供的用于访问Rest服务的客户端模版工具类。因为这里是消费者类,主要是消费,那么就没有service和dao,需要调用pay模块的方法, 并且这里。,那么如果要调用另外一个模块,则需要使用基本的api调用,使用RestTemplate调用pay模块,删除原先支付与订单模块的重复的Payment与CommentResult实体类。可以远程调用支付模块的接口。相似流程建立module。
2024-02-18 21:30:29
96
原创 支付微服务模块
代码如果改动了一会希望自动重启生效,让他自动热部署。添加热部署Pom文件dependency。在pom配置文件中添加Maven插件。当修改代码后会自动进行部署。
2024-02-18 18:47:33
320
原创 SpringCloud与SpringBoot版本选型
git源码地址 :https://github.com/spring-projects/spring-boot/releases/SpringBoot2.x新特性 :通过上面官网发现,Boot官方强烈建议你升级到2.X以上版本。SpringBoot2.x版 + SpringCloudH版。SpringCloud版本对应的SpringBoot依赖选型。SpringBoot选择。
2024-02-18 11:05:19
114
原创 微服务架构零基础理论入门(小白必看)
另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTfulAPI)。提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务都围绕着具本业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。微服务架构是一种架构模式,它。
2024-02-18 10:13:25
239
原创 Spring学习③__Bean管理
① 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建。① 一对多关系:部门和员工一个部门有多个员工,一个员工属于一个部门部门是一,员工是多。②在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示。使用 p 名称空间注入,可以简化基于 xml 配置方式。② 在bean标签有很多属性,介绍常用的属性。第二种方法 赋值里面的一个属性值。DI : 依赖注入,就是注入属性。第一种方法 直接赋值一个对象。//生成dept的get方法。
2023-11-18 20:04:43
336
原创 Spring学习②__IOC分析
控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理使用 IOC 目的:为了耦合度降低原先我们创建在写实现类的时候都要在程序中创建一个对象,现在我们不需要在程序中去创建对象,而是把程序创建对象的主动权交给在测试类中的调用者,程序员不在主动的去管理对象的创建与控制,而是把对象创建、管理交给spring完成,我们只需要在测试类中调用spring提供的接口就行。控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
2023-11-18 15:12:08
195
1
原创 ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群
引入消息中间件后如何保证其高可用?基于zookeeper和LevelDB搭建ActiveMQ集群。集群仅。LevelDB,5.6版本之后推出了LecelDB的持久化引擎,它使用了自定义的索引代替常用的BTree索引,其持久化性能高于KahaDB,虽然默认的持久化方式还是KahaDB,但是LevelDB可能会是趋势。在5.9版本还提供了基于LevelDB和Zookeeper的数据复制方式,作为Master-Slave方式的首选数据复制方案。
2023-11-05 17:51:40
763
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人