自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(140)
  • 收藏
  • 关注

原创 【JavaEE进阶】——Spring事务和事务传播机制

可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.如果其中一个出现异常,那么都回滚,只有都执行成功,那么事务提交。register事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚。

2024-07-20 23:35:22 1212

原创 【JavaEE进阶】——Spring AOP 实现原理

从上述程序可以看出, 虽然静态代理也完成了对⽬标对象的代理, 但是由于代码都写死了, 对⽬标对象的每个⽅法的增强都是⼿动完成的,⾮常不灵活. 所以⽇常开发⼏乎看不到静态代理的场景.为其他对象提供⼀种代理以控制对这个对象的访问. 它的作⽤就是通过提供⼀个代理类, 让我们在调⽤⽬标⽅法的时候, 不再是直接对⽬标⽅法进⾏调⽤, ⽽是通过代理类间接调⽤.(Proxy). 同样的, 如果有新增接⼝(Subject)和业务实现类(RealSubject), 也需要对每⼀个业务实现类新增代理类 (Proxy)。

2024-07-20 16:11:18 795

原创 【JavaEE进阶】——Spring AOP

这种⽅法是可以解决问题的, 但⼀个项⽬中会包含很多业务模块, 每个业务模块⼜有很多接⼝, ⼀个接⼝ ⼜包含很多⽅法, 如果我们要在每个业务⽅法中都记录⽅法的耗时, 对于程序员⽽⾔, 会增加很多的⼯作量。当我们在⼀个项⽬中, 定义了多个切⾯类时, 并且这些切⾯类的多个切⼊点都匹配到了同⼀个⽬标⽅法.当⽬标⽅法运⾏的时候, 这些切⾯类中的通知⽅法都会执⾏, 那么这⼏个通知⽅法的执⾏顺序是什么样的呢?标识的通知⽅法包含两部分, ⼀个"前置逻辑", ⼀个"后置逻辑". 其中"前置逻辑" 会先于 @Before。

2024-07-19 23:36:22 795

原创 【JavaEE进阶】——SpringBoot 统⼀功能处理

⼀般来说,适配器模式可以看作⼀种"补偿模式",⽤来补救设计上的缺陷. 应⽤这种模式算是"⽆奈之举", 如果在设计初期,我们就能协调规避接⼝不兼容的问题, 就不需要使⽤适配器模式了 ,所以适配器模式更多的应⽤场景主要是对正在运⾏的代码进⾏改造, 并且希望可以复⽤原有代码实现新的功能. ⽐如版本升级等.⽅法, 这个⽅法需要返回⼀个布尔类型的值. 如果返回true, 就表⽰放⾏本次操作, 继续访问controller中的 ⽅法. 如果返回false,则不会放⾏(controller中的⽅法也不会执⾏).

2024-07-15 21:31:24 1203

原创 【JavaEE进阶】——利用框架完成功能全面的图书管理系统

🚩项目所需要的技术栈该项目是一个针对于的基础运用项目适合初学者来检验水平测试能力,该项目所需技术栈如下::作为项目的框架,使用Maven托管代码* Mybatis:使用Mybatis框架操纵数据库,其中使用了xml和注解两种方式去操作数据库* 前端ajax:前后端的交互使用的是ajax作为前端为后端发送数据以及接收数据* 项目分层。

2024-06-12 18:08:08 1996 1

原创 【JavaEE进阶】——MyBatis操作数据库 (#{}与${} 以及 动态SQL)

#{}与${} 以及 动态SQL,各类标签使用

2024-06-02 22:37:25 1273

原创 【JavaEE进阶】——Mybatis操作数据库(使用注解和XML方式)

从上述的操作流程中可以看出,对于JDBC来说,整个操作非常的繁琐,不但要拼接每一个参数,而且还要按照模板代码的方式,一步步的操作数据库,并且在每次操作完,还要手动关闭连接等,而所有的这些操作步骤都需要在每个方法中重复书写,那有没有一种方法,可以更简单,更方便的操作数据库呢?此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。我们看到,配置日志文件后,我们就可以观察到,sql语句的执行,以及执行结果,每一行都标注的清清楚楚,并且标注影响的行数。

2024-06-01 18:45:26 1240

原创 【JavaEE进阶】——带你详细了解Spring日志以及配置日志

举个例子:我们进家门,我是一个比较怕黑的女生,我一进家门都是需要开灯的,等我一进门我需要先打开客厅的灯,然后打开厨房的灯,然后打开卧室的灯,一步一步的打开灯,然是如果形象化的理解门面模式,那就是我一进家门只用一个开关就打开了所有的灯,因为这个开关连接着各个灯的,所以这个开关就是提供的一个统一的接口,然后通过这个接口来访问系统的一段接口,方便了我们,也让子系统更容易的使用,不用我跑到厨房然后跑到卧室去开灯了,大大提升了开发效率,也简短了代码量。它通常用于需要在依赖注入完成后进行一些初始化工作的场景。

2024-05-31 20:50:33 1023

原创 【JavaEE进阶】——要想代码不写死,必须得有spring配置(properties和yml配置文件)

文件配置的格式有两种,严格的说是三种,但是yml和properties配置文件都可以 ,只是语法格式不同,优先级不同,我们在不同的场景使用哪个配置文件是可供选择的。如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩ ,但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配置, 以⽤⼾设置的字体⼤⼩来显⽰。我们从下面图片可以看出,单引号和不加单双引号就表示转义字符,而加上双引号表示的是转义字符对应的表示的意思(换行)。

2024-05-27 21:09:02 640

原创 【JavaEE进阶】——一万字带你深刻理解Spring IoC&DI

我们发现了⼀个规律,通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了 Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再 是使⽤⽅对象创建并控制依赖对象了,⽽是把。在上⾯的程序中, 我们是根据轮⼦的尺⼨设计的底盘,轮⼦的尺⼨⼀改,底盘的设计就得修改. 同样因为我们是根据底盘设计的⻋⾝,那么⻋⾝也得改,同理汽⻋设计也得改, 也就是整个设计⼏乎都得改。我们创建下项目默认的启动类都是在最大的包中,如果我们调动启动类的位置。

2024-05-25 21:06:29 984

原创 【JavaEE进阶】——Spring Web MVC (响应)

RestController包含了@Controller和@ResponseBody,如果我们想返回视图就加上@Controller,如果我们想返回视图我们需要在@Controller的基础上加上@ResponseBody注解,因为@RestController是包含了@Controller和@ResponseBody注解,只有@RestController才能返回数据信息。@Controller是类注解,能让spring管理着这个类,需要访问的时候,我们就可以访问。

2024-05-24 18:47:41 1034

原创 【JavaEE进阶】——Spring Web MVC (请求)

在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了。服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.,使用基本类型的话,我们必须要在请求中传值,不传的话就会报错。

2024-05-23 01:43:08 1081

原创 【JavaEE初阶系列】——2W字带你实现博客系统

点不同的博客,跳转过去之后, 都会带有不同的blogId的query string,后续在博客详情页中,就可以也给服务器发起ajax请求,根据这里的blogId,查询数据库,博客的具体内容再返回,前端还是把得到的数据给构造到页面上。服务器收到这个GET请求的时候,就会把会话里的user这个Attribute给删了,由于判定用户是否是登录状态的逻辑中,需要同时验证,会话存在,且这里的user Attribute也存在,只要破坏一个,就可以使登录状态发生改变了。为啥不直接删除session本身?

2024-05-13 20:41:57 541

原创 【JavaEE初阶系列】——Cookie和Session应用之实现登录页面

这里使用Attribute的作用,主要就是为了让一个数据,在多个Servlet之间共享,同时Attribute时会话级别的,每个用户/客户端都是有自己的数据,相互之间都不会有干扰的。如果登录成功,就会给当前这个用户,创建一个会话(这个会话就存储了用户当前的信息),并且把得到的sessionId,通过cookie给客户端(客户端把cookie存储起来)同样的页面,不同用户看到的数据肯定是不同的,支付宝,就有查看资产页面,我访问这个页面,看到的数据,和码云爸爸访问这个页面,看到的数据,肯定是不相同的。

2024-05-12 00:14:09 1202

原创 【JavaEE初阶系列】——理解Cookie 和 Session以及相关API

浏览器发出请求,请求中带有cookie,cookie是一种身份标识也就是sessionId,发出请求,请求就带有了cookie,cookie中呢,又保存了sessionId知道是查哪个用户信息,然后服务器就根据cookieId通过key-value方式找到session对象,就得到了这个用户的基本信息了。拿到身份标识之后就可以得到身份信息,这里的身份信息就是病人的基本信息,当前诊断信息,开的药品信息,既往病例,账户余额........这里的内存结构(存储的是用户的身份信息)——会话(session)

2024-05-10 00:20:30 879

原创 【JavaEE初阶系列】——520快到了 1.7w字详细教你做个JavaWeb表白墙项目

🎓准备工作我们在学习生涯中,我们要从最简单的开始做起,只有一个页面。最终是这种效果图。我们要对这个页面进行一系列的前后端交互操作。但是这里的数据都是浏览器的内存中保存的,刷新页面/关闭页面,东西都没有了。咱们希望表白墙里的数据,能够长期存在,不同的浏览器/页面中,都可以看到同一份数据。——这就需要引入服务器和后台代码。此处,在一个网站中,服务器起到的最主要的效果,往往就是“存储数据”,因此服务器这边往往也就需要能够提供两种风格的接口,存数据,取数据。🎓了解前端部分知识(主要JS)

2024-05-09 00:57:20 692

原创 【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

我们在幼年/青年阶段我们需要学习,成年的时候我们需要工作,老年的时候我们需要养老和退休休息(当我们在执行servlet的时候,我们会根据特定的时间使用上述方法,如果在初始化的时候用init,在释放资源的时候我们用destroy,在收到http请求的时候我们用service方法。相当于在处理一次请求的过程中,tomcat完成了99%的工作,剩余的1%由咱们写的代码来完成,(99%的工作是通用的公共的工作,剩下的1%是结合具体的业务,具有差异化的工作)。a=10&a=20;这几个方法,都是可以在子类中重写的。

2024-05-07 23:53:07 756

原创 【JavaEE初阶系列】——理解tomcat 带你实现最简单的Servlet的hello world程序(七大步骤)

(java中更通用的发布方式,任何程序都可以达成.jar,jar里最重要就是.class文件,Tomcat专属的压缩包,war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html,css,js)但是当然,这样只能我的电脑访问(我的电脑上的tomcat部署的网页),别人的电脑不能 直接访问,除非我们在同一个局域网内(我现在连的是校园网,除非你也连的校园网,然后输入我的ipv4地址,就可以访问了。这个过程,比较麻烦,写代码的时候,修改是非常频繁的。

2024-05-01 19:34:04 838

原创 【Java.mysql】——深度理解MYSQL事务 轻松应对面试问题

此时又会出现一个问题,我们给写加锁了之后,事务B读了数据时,事务A又对该数据进行修改,此时事务B就会读到两个相同数据的两个版本,这就导致了不可重复读的问题,(就像你去买水果,事务A去买水果3元一斤,事务A下次再去买水果的时候是10元一斤,这样就说不过去了,如果事务A去买水果3元一斤,事务B去买水果的时候是10元一斤,其实这样也是可以的)要解决不可重复读,我们就需要给读加锁,再事务B读数据的时候,事务A是不能修改的,此时并发性降低,隔离性大大提高,准确性提高,速度降低了。

2024-04-29 15:36:39 788 2

原创 【JavaEE初阶系列】——HTTPS协议

👩🏻‍💻Https协议👩🏻‍💻Https协议当前网络上,主要都是HTTPS了,很少能见到HTTP,实际上HTTPS也是基于HTTP(前面讲过HTTP的各个方面的内容,对于HTTPS同样适用),只不过HTTPS在HTTP基础之上,引入了“加密机制”。引入HTTPS防止你数据被黑客篡改(尤其是反针对 运营商劫持)下载一个 天天动听未被劫持的效果,点击下载按钮就会弹出天天动听的下载链接已被劫持的效果点击下载按钮就会弹出QQ浏览器的下载链接。

2024-04-25 15:59:58 896

原创 【JavaEE初阶系列】——HTTP协议

使用IP地址,来描述设备在网络上的位置,这种不适合进行宣传,比如引入了”域名“这样的方式来解决上述问题(域名就是单词,表示了实际意义)。需要有一套自动的系统,把域名翻译成IP地址(域名和IP想象成一组键值对)假如的IP地址是192.168.1.0 对应的域名是 www.xxx.com。是属于一组键值对关系。最早的域名解析系统,是通过一个简单的文件来实现的。hosts文件#表示注释 127.0.0.1(value) localhost(key)

2024-04-25 13:49:30 1251 1

原创 【JavaEE初阶系列】——数据链路层以太网以及Mac地址

像交换机这样的设备,收到以太网数据帧的时候就需要进行转发(这个转发过程就需要能够根据mac地址,判定出数据要走哪个网口....(这里的网口是”物理意义上“插网线的口【IP协议,路由器,走哪个网络接口,其实都是抽象的概念,最终还是要在网络链路层才能决定走哪个网口的】)MTU可以考虑成一辆汽车的载重量,路是土路,汽车太重了,就容易压坏,路是沥青路,载重量就更大,路是高速公路级别,载重量就更大。这么多路线,无论走哪条路线,IP数据报里面的源IP始终是“郑州”,目的IP始终是“安庆”。

2024-04-21 23:54:14 286

原创 【JavaEE初阶系列】——网络层IP协议(地址管理和路由选择)

127.0.0.1(最常用的)都表示”设备自身“,自己发给自己,操作系统提供了一个特殊的”虚拟网卡“,关联到了这个IP上,这里的环回IP主要的用途就是进行一些测试性的工作,环回IP能够排除网络不通干扰因素,更好的排查代码中的问题。而进行IP数据报转发的时候每个路由器,都是无法知道,网络的”全貌“的,只知道一些局部的信息(一个路由器能知道哪些设备和它自己相连的),这就意味着IP数据在转发的过程中,是一个”探索式“”启发式“过程。这里的1也不一定是16个,可以根据实际的网络环境,灵活配置的。

2024-04-21 21:17:11 790

原创 【JavaEE初阶系列】——1.5W字让你深度了解TCP中十大主要机制

在进行关机的时候,就是会触发强制终止进程操作,此时就就会触发FIN,对方收到之后,自然就会返回FIN和ACK,不仅仅是进程没了,整个系统也可能关闭了,如果在系统关闭之前,对端返回的ACK和FIN到了,此时系统还是可以返回ACK,进行正常的四次挥手的,如果系统已经关闭了,ACK和FIN迟到了,无法进行后续ack的响应,站在对端的角度,对端以为是自己Fin丢包了,重传FIN,重传几次都没有响应,自然就会放弃连接(把持有的对端的信息就删了)一旦索要到了1001的数据,那么就会覆盖前面7000 个数据。

2024-04-18 18:30:55 794 1

原创 【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

我们知道搜狗的浏览器有些网页下面会显式广告俩字,由于业务的发展,广告越来越多了,广告的样式也越来越复杂了,导致商搜服务器和入口服务器之间交互的数据流,已经接近64kb,如果超过上限,数据就会出现截断,最终展示在页面上的数据肯定会出错的。上述的过程就是自定义协议,自定义协议,具体的方式,也是非常灵活的,针对这里的情况,使用啥样的格式来组织,都ok,只要客户端和服务器这边都能够对应上即可。把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这俩个字节的变量中,累加过程中如果溢出,也没关系。

2024-04-16 00:25:15 981

原创 【JavaEE初阶系列】——网络编程 TCP客户端/服务器 程序实现

TCP是有连接的,连接就意味着通信双方会记录保存对端的信息,UDP来说,每次发送数据都得手动send方法中指定目标地址(UDP自身没有存储这个消息)TCP来说,则不需要,前提是需要先把连接给建立上。,服务器启动之后用到accept方法,把内核中建立好的连接到应用程序中去(建立连接的过程是内核自动完成的,应用程序是捡漏的),如果没有与客户端连接,那么就阻塞等待。内核直接完成了连接建立的流程(三次握手),完成流程之后,就会在内核的队列中(这个队列是每个serverSocket都有一个这样的队列)排队。

2024-04-12 21:14:48 1295

原创 【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现

通过网络,让俩个主机之间进行通信,基于这样的通信来完成一定的功能。进行网络编程的时候,需要操作系统给咱们提供一组api,通过这种api才能完成编程。api可以认为是应用层和传输层之间交互的路径。socket api就相当于插座一样,通过这一套socket api可以完成不同软件之间,不同操作系统之间的通信。传输层,提供的协议,主要有2个,TCP和UDP这俩个。TCP和UDP这俩个协议的特性(工作原理) 差异很大,导致,使用俩种协议进行网络编程,也存在一定差别,系统就分别提供俩种api。

2024-04-11 18:20:08 1043 1

原创 【JavaEE初阶系列】——网络初识—TCP/IP五层网络模型

二进制数据来进行传递数据的。那天一个男生B见到天桥上一个女生在那站着,过去问请问你是不是来相亲的,那个女生说是的,然后我们就开始在桥边散步了,当我们边走边聊,男生B发现女生的情况和媒婆说的情况不一样,最后发现确实认错了,然后就和那个女生说抱歉,我们认错了,然后回到那个天桥之后,发现人已经走了。(应用层协议,往往是根据具体的场景,具体的需要,由程序员自主决定的)QQ应用程序,QQ就会把用户输入的“hello”,给打包成一个应用层的数据报(这个数据报的格式,得是qq的程序员才能知道的) 假设是按照下面的格式。

2024-04-10 00:32:07 934

原创 【JavaEE初阶系列】——一万多字还不能知道 文件IO 之 文件内容操作(文件内容的读写-数据流)吗?

🚩流对象(Stream)就像水流,绵绵不息,比如要接水,要接100ml的水,我们可以一次性直接全部接完100ml,也可以分俩次接,一次接50ml,也可以分五次接,一次接20ml.....等等有无数种方案,水的特点称为”水流" ,而我们读写100字节的文件数据,直接一次性读/写100字节,分俩次,一次读写50字节,分5次,一次读写20字节.......等等无数种方案。完成上述读写文件操作,同样也有“无数种”方案。文件的特点称之为“文件流”。

2024-04-05 16:08:42 887

原创 【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

📝认识文件所谓的"文件"是一个广义的概念,可以代表很多的东西。操作系统里,会把很多的 硬件设备 和 软件资源 都抽象成 "文件",统一进行管理。但是大部分情况下,谈到的文件,都是指硬盘的文件。文件就相当于是针对 "硬盘" 数据的一种抽象。我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。

2024-04-04 19:10:31 845

原创 【JavaEE初阶系列】——一万字带你了解 JUC常见类 以及 线程安全集合类(哈希表)

可重入锁任务进度🚩Callable是一个相当于把线程封装了一个返回值".方便程序猿借助多线程的方式计算结果。Runnable不在意结果,而Callable接口,创建线程,可直接返回结果。创建一个类Result ,包含一个sum表示最终结果, lock表示线程同步使用的锁对象main方法中先创建Result实例然后创建一个线程t.在线程内部计算主线程同时使用wait等待线程t计算结束. (注意如果执行到wait之前线程t已经计算完了。

2024-04-03 01:49:54 777

原创 【JavaEE初阶系列】——synchronized原理及优化(偏向锁,轻量级锁,自旋锁,锁消除,锁粗化)

而普通的锁就如synchronized锁不是读写锁,不管是读锁和读锁之间,读锁和写锁之间,写锁和写锁之间,都是会造成阻塞等待,而读写锁,只有在数据的写入方互相之间以及和读者之间都需要互斥,其余的在读取方之间不会产生线程安全问题,所以我们在频繁读,不频繁写的场景下,读写锁是很优化的,减少了锁之间的冲突。就比如我去找导员有事,我害怕她不在,白跑一趟,所以我先发信息问问导员在不在办公室[这就相当于加锁],如果得到肯定的回复那么就去,得到否定的回复,那么就不去,等下次他在了,我再去问。更加高效的完成任务。

2024-04-02 01:41:05 1161

原创 【JavaEE初阶系列】——CAS

CAS:全称,字面意思:”比较并交换,一个CAS涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。1. 比较 A 与 V 是否相等。(比较)2. 如果比较相等,将 B 写入 V。(交换)3. 返回操作是否成功。CAS 比较交换的是 内存 和 寄存器。比如有一个内存M,现在有俩个寄存器A,B.CAS(M,A,B)如果M和A的值相同的话,就把M和B的值交换,同时整个操作返回true.如果M和A的值不同的话,无事发生,同时整个操作返回false.

2024-03-31 19:08:28 1031

原创 【JavaEE初阶系列】——常见的锁策略

在我们等人的时候,对方还没有到达约定的地点,一直反复的打电话催促就是自旋锁,而当你发现对方还没到的时候,就在约定的地方找个地方玩手机,叫他来了再在约定的地点旁边找我们一下,多消耗一点时间,却能够用这些时间去做其他的事情,时间被利用起来了,这就是挂起等待锁。按照之前对于锁的设定, 第二次加锁的时候, 就会阻塞等待. 直到第一次的锁被释放, 才能获取到第二个锁. 但是释放第一个锁也是由该线程来完成, 结果这个线程已经躺平了, 啥都不想干了, 也就无法进行解锁操作. 这时候就会。如果不会,那么这个锁就是。

2024-03-31 16:02:56 972

原创 【JavaEE初阶系列】——多线程案例四——线程池

🚩什么是线程池首先我们想象一个场景就是比较渣的场景,我是一个男生,很帅并且有才华,追问的人呢,很多,排成了一个长队。然后我就挑了一个既好看又有钱又有才华的女生进行交往,交往一段时候后,我腻歪了,想换个女朋友,此时我要做俩个事情:1>想办法分手,2>再找一个小哥哥,培养感情。此时进行这俩个操作的时候,效率是很低的,有没有办法优化呢?优化:我和这个女生A再交往的过程中,同时再和另一个女生B搞暧昧(培养感情),当我想和女生A分手的时候,就只要分手了后我们就可以和女生B直接在一起了。

2024-03-29 00:34:58 1176

原创 【JavaEE初阶系列】——多线程案例三——定时器

首先我们需要获取当前堆顶的元素(也就是执行时间最先的一个),然后我们需要获取当前的绝对时间(就是你现在再看我的博客的时间),我们需要和任务类里面的time绝对时间(这里的绝对时间是我们要执行任务的时间)相比较,如果当前时间大于等于执行任务时间,那么我们就得执行该任务,执行完后从队列中删除,如果当前时间小于要执行任务的时间,我们就得不执行,等到时间到了为止。定时器非常常见,尤其在进行网络通信的时候。另一个参数是相对时间,当前安排的任务,啥时候执行,此处填写的时间,就是以当前时刻为基准,往后再推xxx的时间。

2024-03-26 22:10:07 1260

原创 【JavaEE初阶系列】——多线程案例二——阻塞队列

这就保证了整个系统在突发情况下,都能更好的控制。head指向的是队列的头部位置,tail是每插入一个元素tail都往后移一位,[head,tail)构成了一个区间,这个区间里的内容就是当前队列中的有效元素~,入队列,把新的元素,放到tail位置上,同时tail++,出队列,把head指向的元素给删除掉,head++;关键要点,当wait返回的时候,需要进一步确认一下,看当前队列是不是满的(本来是因为队列满,进入阻塞,接触阻塞之后,再确定一下队列满不满,如果经过确定之后,队列还是满的,继续进行wait)

2024-03-24 16:31:52 996

原创 【JavaEE初阶系列】——多线程案例一——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)

但是一旦代码这样写,后续每次调用getInstace,就需要先加锁了,但是实际上,懒汉模式,线程安全问题,只是出现在最开始的时候(对象没有new的情况),一旦对象new出来了,后续多线程调用getInstace,就只有读操作,就不会线程不安全了。如果多个线程情况下,第一次对象是null,此时创建好对象之后,其他线程阻塞等待,然后后面线程继续进行,然后一直加锁,if判断不成立,就进行解锁,然后其他线程又加锁,这样如果有一百个线程进行,那么就会有一百次加锁的情况,那样性能方面是开销很大的。

2024-03-23 19:22:08 1213

原创 【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

🚩volatile关键字🚩volatile关键字volatile修饰的变量 能保证内存可见性在学习Java多线程编程Q里,volatile 关键字保证内存可见性的要点时,看到网上有些资料是这么说的:线程修改一个变量,会把这个变量先从主内存读取到工作内存;然后修改工作内存中的值,最后再写回到主内存。对内存可见性问题的表述为: t1 频繁读取主内存(内存),效率比较低,就被优化成直接读自己的工作内存(cpu寄存器);

2024-03-23 14:35:50 1345

原创 【JavaEE初阶系列】——synchronized 的特性(互斥和可重入性)

一个锁对象object,一个线程t,第一次加锁,假设能够加锁成功,此时的object就属于"被锁定"状态,再进行第二次加锁的时候,很明显,object已经是锁定的状态了,第二次加锁操作,原则上来说,是应该要"阻塞等待"的,应该是等待到,锁被释放了之后,才能加锁成功.哲学家相当于线程,筷子相当于锁,同一时刻,五个哲学家发现,他们的右手边都没有筷子,与时只能拿起左手的筷子,此时,五个哲学家发现,他们的右手边都没有筷子,只能阻塞等待,等待过程中,,不会放下左手的筷子。(可重入锁就是可以重复进入的锁,也叫递归锁。

2024-03-23 11:46:47 703

空空如也

空空如也

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

TA关注的人

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