- 博客(41)
- 收藏
- 关注
原创 JavaWeb——关于servlet种mapping地址映射的一些问题
此处定义了两个servket,一个路径为/hello,一个路径为/ *。按理来说,/ *包含了/hello,但由于优先级问题,我们在网址栏输入/hello时,它会优先找/hello,如果找不到,再找/ *。便开始排查问题,一开始是以为web.xml配置问题,但是经过几次调整后都没有解决,后来排查java文件是否出现问题,一开始以为自己少引入了包,后来修改doget后才恢复正常。在web.xml配置多个servlet映射路径(这里有两个servlet,一个是hello,一个是404)
2023-10-26 22:12:49
1183
原创 JavaWeb——Servlet原理、生命周期、IDEA中实现一个Servlet(全过程)
在JavaWeb中,Servlet是基于Java编写的服务器端组件,用于处理客户端(通常是Web浏览器)发送的HTTP请求并生成相应的HTTP响应。Servlet运行在Web服务器上,与Web容器(如Tomcat)进行交互,通过Web容器将请求分发给适当的Servlet进行处理。,可以接收并解析HTTP请求,执行业务逻辑,生成HTML、XML或其他格式的响应结果,并将其返回给客户端。Servlet可以处理各种不同类型的请求,如GET请求、POST请求等,并可以访问请求的参数、请求头、会话信息等。
2023-10-25 11:03:26
788
原创 JVM——GC垃圾回收器
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)内存整齐度:复制算法=标记压缩算法>标记清除算法内存利用率:标记压缩算法>标记清除算法>复制算法GC:分代收集算法存活率低复制算法区域大,存活率高标记清除(内存碎片不是太多的情况下)+标记压缩(内存碎片太多就压缩)混合实现。
2023-10-25 09:13:24
883
原创 JVM——堆内存调优(Jprofiler使用)Jprofile下载和安装很容易,故没有记录,如有需要,在评论区留言)
本章节是关于堆内存调优,查看堆内存状态,使用的工具是Jprofile,Jprofile下载和安装很容易,故没有写下来,如有需要,在评论区留言
2023-10-23 23:29:33
725
原创 JVM——一些零散的概念(后续学习深入了再补充)
凡是带了native关键字的,说明Java的作用范围的达不到了,需要调用底层C语言的库调用native方法,会进入本地方法栈,调用本地接口(JNI)JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用它在内存区域中专门开辟了一块标记区域:Native Method Stack(本地方法栈),登记native方法在最终执行的时候,加载本地方法库中的方法通过JNI调用其他接口:Socket、WebService、http。
2023-10-23 23:22:53
824
原创 JavaWeb——IDEA相关配置(Maven配置以及创建自己的第一个Maven项目)
笔者根据狂神说的javaweb视频,跟着配置IDEA中的Maven,在后面,笔者将讲述自己如何从0配置Maven以及创建自己的第一个Maven项目,笔者将自己的心路历程,包括配置的过程,都以文字加图片的形式体现出来,即使小白也能跟着一步一步做!最最重要的是,笔者将自己走过的坑包括如何解决这些坑的方式都写下来了!有些地方笔者只写出了解决方法,并没有写出原理,如果有大佬了解,请在评论区为笔者解惑,万分感谢!
2023-10-21 21:02:16
3698
原创 JVM——JVM概述以及双亲委派机制
当一个类加载器收到类加载的请求时,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。如果父类加载器可以完成类加载任务,就成功返回,如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。在双亲委派机制中,父类加载器先于子类加载器执行,子类加载器在无法完成加载任务时才尝试自己加载。栈中只存在实例对象的引用,即,栈中只保存,car1、car2、car3实例对象的地址,实例对象的真正数据存在于堆中,而stack存放的信息即为对应的堆地址。如何获得系统类加载器可以加载的路径。
2023-10-20 19:48:55
522
原创 JUC并发编程——各种锁的理解(基于狂神说的学习笔记)
false == true,所以会进入循环,循环体内什么都没有,又会进入判断,周而复始,直到那个线程unlock,调用CAS将thread修改为null。至此,读者可以看到,T1在打印“has this lock”之后,T2是无法持有该锁,它在不断地自旋,即进入while循环一直判断,我们来看一下这个代码在做什么。可以类比成:当你拿到进入一个房子的锁,进入房子后,再拿到进入卧室的锁,进入卧室,此时,就算你已经拿到了卧室的锁,你也并没有放弃房子的锁,别人依然进不来房子。synchronized版。
2023-10-20 19:41:53
209
原创 JUC并发编程——CAS与原子引用(基于狂神说的学习笔记)
CAS 是Java设置的CPU的并发原语Java是无法直接操作内存的但Java可以调用C++而C++可以操作内存Java可以通过native类调用C++来操作内存CAS = Compare And Set 比较并交换CAS是:比较当前内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作,如果不是就一直循环比较(自循环)1、自循环会耗时2、一次性职能保证一个共享变量的原子性3、会存在ABA问题/***/
2023-10-19 19:15:53
186
原创 JUC并发编程——单例模式(基于狂神说的学习笔记)
使用synchronized与volatile的懒汉式单例。以上单例都不安全,使用反射即可破坏单例。使用枚举单例模式,反射无法破坏枚举单例。
2023-10-19 19:13:48
547
原创 JUC并发编程——Volatile详解(基于狂神说的学习笔记)
然后A又抢到CPU资源,因为A之前的操作停留在num++上,也就是说,它的下一步是将num写入内存(机器很傻,它不会察觉自己手上的num已经发生改变,而是遵循着代码的顺序,执行下一条指令,而num++后的下一条指令为“把num写入内存”)它将自己手上的num,也就是51,又写进内存。因此,A线程与B线程进行了两次num++操作,理应num应该从50变到52,结果只是从50变成51,而在程序中,这种情况可能出现,也可能不会出现,可能在任何时候出现,因此无法预测,每一次运行都是一个全新的结果。
2023-10-18 19:32:24
171
原创 JUC并发编程——JMM详解(基于狂神说得到学习笔记)
参考文献JMM概述-CSDN博客内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行”。
2023-10-18 19:30:36
186
原创 JUC并发编程——ForkJoin与异步回调
ForkJoin在JDK1.7出现 ,并行执行任务,在大数据量下,能够提高效率讯飞星火提供的说法:Forkjoin是一种并行计算的算法,用于将一个大任务分解为多个小任务,然后将这些小任务分配给不同的线程或进程来并行执行,最后再将结果合并。在计算机科学中,Forkjoin通常用于实现基于分治策略的程序和数据结构,例如排序算法、图遍历算法、哈希表等。它可以有效地利用多核处理器的并行计算能力,提高程序的性能。
2023-10-18 00:01:54
190
原创 JUC并发编程——Stream流式计算(基于狂神说的学习笔记)
Stream流式计算是一种基于数据流的计算模式,它可以对数据进行实时处理和分析,而不需要将所有数据存储在内存中。Stream流式计算是将数据源中的数据分割成多个小的数据块,然后对每个小的数据块进行并行处理,最后将处理结果合并。这种方式可以大大提高程序的执行效率,因为每个小的数据块都可以在一个独立的线程中进行处理,而不需要等待整个数据集被处理完毕。Stream流式计算的优点有很多,其中最重要的是它可以大大提高程序的执行效率。Stream采用了一种延迟计算的机制只有在终止操作时才会触发计算。
2023-10-18 00:00:13
213
原创 JUC并发编程——四大函数式接口(基于狂神说的学习笔记)
函数式接口:只有一个方法的接口 ,例如:Runnable接口。断定型接口:只有一个输入参数,返回值为boolean。在新版本的框架底层中,函数式接口有大量的应用。函数型接口,有一个输入参数,有一个输出。消费型接口,有一个参数,没有返回值。供给型接口:没有参数,只有返回值。简化编程模型,使代码更加可读易懂。
2023-10-16 22:43:43
217
原创 JUC并发编程——线程池学习:基础概念及三大方法、七大参数、四大拒绝策略(基于狂神说的学习笔记)
在上述例子中,因为for循环开启了10个线程,大于线程池的最大承载量(5+3=8),如果线程处理速度不够快,在最大承载量到达之前又来了请求,则会触发拒绝策略,而AbortPolicy()拒绝策略则是,当超过线程池最大承载量时,则会放弃之后请求,并抛出异常。maximumPoolSize:线程池最大容量(线程池并非时时刻刻所有线程都开启的,时时刻刻一直开启的只有核心线程),当阻塞队列已满,线程池还有未开启线程时,线程池将会开启未启动的线程。池化技术的本质:事先准备好一些资源,线程复用,用完即还,方便管理。
2023-10-16 22:42:11
531
原创 JUC并发编程——阻塞队列(基于狂神说的学习笔记)
它的内部只能够容纳单个元素,如果队列已有一元素的话,试图向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中抽走。同样,如果队列为空,试图向队列中抽取一个元素的线程将会阻塞,直到另一个线程向队列中插入了一条新的元素。SynchronousQueue是Java中的一种特殊队列,它是一个线程安全的队列,不存储任何元素,每次插入操作必须等待其他线程的删除操作,反之亦然。打印put -----> take语句执行 -----> put语句执行。当读取时,如果队列为空,则必须阻塞等待。
2023-10-15 12:53:21
149
原创 JUC并发编程——读写锁(基于狂神说的学习笔记)
读写锁是否会提高使用互斥锁的性能取决于与被修改相比读取数据的频率,读写操作的持续时间以及数据的争用 - 是,将尝试同时读取或写入数据的线程数。此外,如果读取操作太短,则读写锁定实现的开销(其本质上比互斥锁定更复杂)可以支配执行成本,特别是因为许多读写锁定实现仍然通过序列化所有线程。理论上,使用读写锁所允许的并发性的增加将导致相互使用互斥锁的性能提高。实际上,这种并发性的增加只能在多处理器上完全实现,并且只有在共享数据的访问模式合适时才能实现。读写锁允许访问共享数据的并发性高于互斥锁允许的并发性。
2023-10-15 12:51:38
148
原创 JUC并发编程——常用的辅助类(基于狂神说的学习笔记)
每次线程调用countDown()数量-1,假设计数器变为0,countDownLatch.await()就会被唤醒,继续执行。// 释放当前抢占资源的线程,如果还有线程等待工作,换下一个线程进来。命令,该命令在每个障碍点运行一次,在聚会中的最后一个线程到达之后,但在释放任何线程之前。acquire()方法,使线程获得资源,每有一个线程获得资源,信号量-1,若信号量为0,则剩余线程等待。release()方法,释放,会将当前的信号量释放并+1,然后唤醒等待的线程。是一种多功能同步工具,可用于多种用途。
2023-10-14 17:29:25
252
原创 JUC并发编程——集合类不安全及Callable(基于狂神说的学习笔记)
CopyOnWriteArrayList使用了一种特殊的写时复制机制,它在对数组进行修改时,会创建一个新的副本,而不是直接在原数组上进行修改。然而,由于每次修改都需要创建一个新的副本,所以在写入操作频繁的情况下,CopyOnWriteArrayList的性能可能会比较低。在写时复制策略中,数据结构被修改时,修改操作会在一个新的副本上进行,而不是直接在原始数据上进行。由于创建新数组和修改操作是在一个单独的写锁上进行的,因此多个线程可以同时读取原始数组,而不会看到正在进行的写入操作。关键字来实现线程安全。
2023-10-14 17:24:15
634
原创 JUC并发编程——8锁现象(基于狂神说的学习笔记)
static 则表名该方法与Class同步产生,因此,static是在Class对象中的,如果synchronized锁锁住了static方法,则表明锁住了整个Class对象,而因为Class对象唯一(所有的实例对象都通过Class对象创建的)因此,无论后续创建了多少个实例对象资源,最终只要某一线程持有住某一静态同步方法的锁,则其他静态同步方法一律无法使用。8个锁的问题,两两分组,问题,答案,代码皆在下面代码块中,如有问题后续补充。普通同步锁实例,静态同步锁模板,即使再多实例在,静态之间统一管。
2023-10-12 22:14:42
148
原创 JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)
JUC时java.util工具包中的三个包的简称业务:普通的线程代码中,我们常使用Runnable接口但Runnable没有返回值,且效率相比较于Callable来说相对较低,功能也没有Callable强大Lock锁与synchronized锁的区别要分清在多线程情况下,不要使用if条件语句来判断是否wait或await某一线程,要用while循环语句来判断,否则线程不安全。
2023-10-12 22:02:37
1402
原创 Java多线程——线程同步与锁(基于狂神说的学习笔记)
处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改对象。这个时候我们就需要线程同步。线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个形成队列,等待前面的线程使用完毕,下一个线程再使用。
2023-10-10 21:48:41
149
原创 Java多线程——线程状态以及线程礼让,线程休眠的区别(基于狂神说的学习笔记)
遗留问题:线程真的停止了吗,在上述代码中,虽然线程检测到flag为false,不会进入while循环,但后续线程是否仍然会不停的抢夺资源,进行while循环的检测操作答:不会,线程中主要执行线程体是run方法,当while结束之后,run方法内代码也到了结尾,因此run方法结束,因此线程结束。
2023-10-10 21:46:17
55
原创 Java多线程-——静态代理以及Lambda表达式(基于狂神说的学习笔记)
对于实现函数式接口的多种形式:实现类,静态内部类,局部内部类,匿名内部类,lambda表达式。Lambda表达式的多种简化形式。
2023-10-09 21:56:03
45
原创 Java多线程——线程创建的三种方法(基于狂神说的学习笔记)
多线程学习——看了狂神说的多线程视频,感觉内容非常多。笔者在边看视频边做笔记,也跟着视频写代码运行后,把知识点以及个人的一些感悟和遇到的问题,解决方式写了下来,供大家学习和参考
2023-10-08 23:57:44
115
原创 Java学习day3——Javaweb登录页面设计(1)(含JSP代码)
写在前面本文主要的内容是完成网页登录页面设计,以及判断用户名密码是否正确,如果正确,进入下一页面,并输出sessionID,若错误,则在登录页面给出用户名或密码错误提示,并在登录页面显示访问次数。登录页面任务一:完成登录页面设计登录页面(userLogin.jsp)用户名输入框 密码输入框 提交内容到登录处理页面(loginSuccess.jsp)使用html中的<form>标签<form method="post" action="loginSuccess.
2022-05-06 16:07:55
10368
原创 数学模型——泊车模型(2022年Mathorcup数学建模挑战赛C题,含Matlab代码)
写在前面之前做了一个2022年Mathorcup数学建模挑战赛C题的比赛心得,上一篇文章主要讲了A*算法的改进以及A*算法如何在C题的第3问的应用。本文主要介绍C题的第2问,即三种泊车模型如何建立,因此部分并非我写,在比赛期间,我主要攻克的是第3问,因此,写这篇文章也花了我不少心思,重新看代码,跑代码,尽可能详细地讲清楚泊车模型地建立,希望能够帮到有需要的同学。题目先来看问题:图4如下:根据题目要求,我们要做出车辆从初始位置到10号垂直停车位,82号平行停车位以及31号倾斜.
2022-05-06 00:03:00
10840
64
原创 数学模型——垃圾运输问题,运输车的路径以及数量选择(含matlab代码)
写在前面垃圾运输问题可以看作是一个NP完全问题,但很遗憾的是,目前我们所掌握的数学知识并不足以让我们找到一个有效找到NP完全问题全局最优解的算法,甚至,在数学界中还无法确定NP完全问题是否真的存在找到全局最优解的有效算法。在本问题中,我选择通过遍历和迭代来寻找最优解,当然,我会给出一些约束条件来对其做出限制,以此来限制遍历的方向,加快遍历的速度。问题其实这个作业一共有3问,但本文着重介绍第1个问题的解决方法,因此只将第1个问题截图出来。在本问题中,我们可以知道:每个垃圾站的编号,横坐
2022-05-03 23:47:13
8388
12
原创 Java学习day2——包装类
写在前面 Java使用基本类型以及对象来表示数据,但是在某种情况下,我们必须使用对象来表示我们所需要使用的数据,正如上一篇HashMap简介一样,我们需要将基本类型int,转换乘包装类Integer,这样才能将数据存储进HashMap。包装(wrapper)类表示一种特殊的基本类型。例如:Integer类表示一个整型量。由Integer类创建的对象只保存一个int型的值。包装类的构造方法Integer obj = new Integer(40);如上所示,obj对象就将4...
2022-05-01 23:36:16
820
原创 JAVA学习day1——HashMap简介(含代码)
写在前面HashMap是一个散列表,可以用于储存数据,和C++的数组功能相似,但在Java中有很多类都能实现数组的功能,只是存取方式不同,排序方式不同。HashMap就是其中之一。HashMap有以下特点:存储键值对应的映射 实现Map接口,具有很快的访问速度 最多允许一条记录的键位null 不支持线程同步(在java多线程编程中,这一点尤为重要) 无序存储,不会记录插入的顺序HashMap的存储内容在上面我们给出了HashMap的存储内容的定义:HashMap存储键值对应的映射,
2022-04-30 15:26:09
1221
原创 2022年Mathorcup数学建模挑战杯C题比赛心得总结(1)——A*算法的应用与优化(含Matlab代码)
写在前面今年参加了Mathorcup数学建模挑战杯比赛,参加这个比赛也是我和我的两个小伙伴在聊天时突然想要冲一冲。我们找到了很优秀也很尽责的指导老师,教导了我们很多知识,无论是老师的指导,在解题过程中的思考还是查阅参考文献,都给我带来了非常多的建模与算法知识。今天像写一些我在解决2022年MathorcupC题的思路,仅个人思路,尚不成熟也不完美,不一定是“全局最优解”。 在最后我会贴上我解题的代码,我是找到网上的代码,并根据自己的需求做出相应的改变,如果遇到我一样的问...
2022-04-20 00:06:51
9788
8
原创 数学模型——Logistic回归模型(含Matlab代码)
写在前面Logistic回归模型是一种非常常见的统计回归模型,在处理大量数据,揭示各自变量对因变量之间的关系时有着十分重要的作用。笔者在写Logit回归模型前参加了一次市场调研比赛,在这次比赛中学到了很多东西,同时发现,许多优秀获奖论文在模型建立时都采用了Logit模型。笔者在查阅多篇文章及书籍后发现,Logsitc模型与Logit模型本质上并没有不同,其不同之处在于数学表达形式不同。一个十分经典的例子:在智能手环满意度市场调查中,我们可以采用Logit模型分析性别,...
2022-04-09 09:37:12
45712
4
原创 《算法导论》阅读笔记——插入排序
今天读了《算法导论》,趁晚上有些许空闲时间做一下读书笔记。插入排序排序问题是算法题中非常重要又基础的部分,完成排序有许多算法,冒泡排序,桶排序,插入排序,快速排序等等。以下我写一些我对插入排序的一些理解和提供伪代码。插入排序思想对于少量元素的排序,插入排序是一个有效的算法,插入排序的工作方式,像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右...
2022-04-03 23:21:48
739
原创 Java编程思想——转型问题
写在前面在翻阅《Java编程思想》时,意外发现一句话:“它必须被向上转型为Object,因此它会丢失其身份。”这里就引出了两个问题,向上转型是什么?为什么会丢失身份,有没有向下转型?转型所谓转型,就是指将一种类型转换成另一种类型。但我们不能在两个毫无关联的类型之间转来转去,比如要把我与另一个与我毫无关联,不知姓名不知年龄的人关联在一起,别说计算机,就算是人也很难接受。所以,在Java中,我们所讨论的转型,是在继承关系之间的转型。转型分为向上转型与向下转型。下面我们给出两者的定义:向上
2022-01-15 22:58:31
192
原创 Linux学习(2)——传输文件
有些时候可能需要在不同的操作系统中进行文件传输,比如,需要在windows10操作系统中将D盘中的ftp文件夹中的内容传输到Linux操作系统中。我们可以使用FTP协议,在不同系统之间传输文件,可以使用ftp命令在网络上将一台计算机上的文件复制到另外一台计算机上。ftp命令的前置工作如果在Linux系统中还没有安装vsftpd,可以在root用户下使用如下命令安装:yum install vsftpd在使用ftp传输文件时,既可以利用正文模式也可以使用二进制模式,ftp命令的语法非常简
2021-10-14 16:55:56
1870
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人