JAVAEE初阶
文章平均质量分 86
JAVAEE初阶
枫念枫
一个吊车尾的学生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM八股文
JVM内存划分为程序计数器、元数据区、栈和堆四个核心区域,模拟操作系统内存管理。类加载采用双亲委派模型,经历加载、验证、准备、解析和初始化五个阶段。垃圾回收(GC)通过可达性分析识别垃圾对象,采用分代回收策略:新生代使用复制算法,老年代减少扫描频率。GC会引发STW暂停,但JDK17后可将影响控制在1ms内。分代回收根据对象存活时间采用不同策略,提高内存管理效率。原创 2025-12-21 12:19:18 · 1407 阅读 · 0 评论 -
数据链路层与物理层
本文介绍了以太网协议在数据链路层和物理层的作用,重点分析了MAC地址与IP地址的区别:MAC地址是设备的唯一物理标识,用于相邻设备间的转发;IP地址则用于网络层的整体传输路径。文章还阐述了ARP协议获取MAC地址的过程,以及DNS系统将域名解析为IP地址的机制,包括DNS缓存和服务器架构。最后指出我国正发展IPv6和DNSv6以减少对国外根服务器的依赖。原创 2025-12-20 12:23:58 · 475 阅读 · 0 评论 -
基础IP协议知识
网络层最主要的协议就是IP协议,IP协议最主要的工作有两个一个地址管理,使用IP地址这个概念,标识网络上某个设备的位置二是路由选择,在两个通信节点之间选一个合适的路径。原创 2025-12-19 21:02:58 · 640 阅读 · 0 评论 -
UDP和TCP的核心
本文详细解析了TCP与UDP协议的核心特性与差异。UDP协议采用无连接、不可靠传输模式,面向数据报,最大传输64KB数据;TCP协议则通过确认应答、超时重传等十大机制确保可靠传输,包括三次握手建立连接、滑动窗口提升效率、流量控制调节速度等。重点阐述了TCP的可靠性保障机制,如序号确认解决乱序问题、超时重传应对丢包、拥塞控制动态调节传输速率等。同时分析了TCP粘包问题及解决方案,以及异常情况处理机制。最后对比了两种协议的应用场景,并指出可通过在UDP上实现TCP机制来兼顾可靠性与效率。原创 2025-12-19 16:02:45 · 1248 阅读 · 0 评论 -
HTTP的加密过程
HTTP协议中状态码分为2xx(成功)、3xx(重定向)、4xx(客户端错误)和5xx(服务器错误)。HTTPS通过SSL/TLS加密机制解决HTTP明文传输的安全问题,采用非对称加密传输对称密钥,再用对称加密传输数据。为防止中间人攻击,引入证书机制:由可信第三方机构颁发包含服务器公钥、域名等信息的数字证书,客户端通过操作系统内置的公钥验证证书有效性。这种机制确保即使网络被劫持,攻击者也无法伪造证书,保障了通信安全。原创 2025-12-17 20:29:07 · 746 阅读 · 0 评论 -
HTTP的数据报格式
根据需求确定需要传输什么信息约定好信息组织的格式行文本,冗余度高,可读性高,消耗带宽最多Xml:可读性也高,冗余度也高,消耗带宽多Json:可读性高,冗余度适中,消耗带宽中(最主流的写法)Protobuf:可读性低,冗余度低,消耗带宽低浏览器允许网页在本地硬盘存储数据的一种机制,不让网页代码直接访问文件,而是浏览器的cookie提供了键值对的存储机制。原创 2025-12-16 21:02:54 · 1155 阅读 · 0 评论 -
TCP和UDP的区别
UDP是无连接的意思是他不会记录是谁和他连接,这个连接是抽象虚拟的,传输是不可靠传输,意思是UDP只管传不管怎么样,传了,到不到就不管我事了,传输效率肯定高的很,毕竟不管送没送到,只管送没送,全双工的意思是可以进行读写,半双工就是只能选择一个。TCP有连接的意思是他会记录下来这个时候对方是谁,在和谁进行通讯,可靠传输就是指,他会尽量的把数据完好无损的送到目的地,全双工,可以进行读写,传输效率肯定是要低一些的,毕竟都送完好无损的还要求速度,说不过去了。原创 2025-12-15 17:02:42 · 780 阅读 · 0 评论 -
传输层TCP协议
本文介绍了基于TCP协议的服务器和客户端实现。TCP协议特点是面向字节流、有连接、可靠传输。服务器端使用ServerSocket建立连接,Socket处理数据,通过InputStream和OutputStream进行字节流读写,并采用Scanner和PrintWriter简化操作。客户端同样使用Socket连接服务器,通过字节流进行通信。针对多客户端并发访问问题,提出了多线程解决方案,并建议使用线程池优化性能。文中详细展示了TCP回显服务器的实现思路和代码结构,包括连接建立、请求处理、响应返回等核心流程,以原创 2025-12-15 16:15:09 · 866 阅读 · 0 评论 -
网络编程UDP
前面的是格式,后面的是一一对应的东西,分别打印请求的ip和端口号,还有请求是啥,回应是啥。原创 2025-12-14 19:55:02 · 1423 阅读 · 0 评论 -
网络基础知识
在这个过程中就相当于一步步封装,把内容一步步通过各项协议封装好,就好像女朋友出门之前,要美美的化妆,好好的搭配,最后才会出门(女朋友素颜也好看💗)。原创 2025-12-13 16:48:57 · 653 阅读 · 0 评论 -
JAVA中如何操作文件
本文介绍了Java文件系统的基本操作,包括文件创建、删除、重命名、目录操作等。重点讲解了File类的使用方法,包括路径获取、文件检测、创建删除等。详细分析了字节流(InputStream/OutputStream)和字符流(Reader/Writer)的工作原理,强调流操作必须遵循"打开-读写-关闭"的原则。特别指出要注意资源管理问题,推荐使用try-with-resources语法避免资源泄漏。文章还对比了绝对路径和相对路径的区别,解释了文件描述符的概念,并提供了实际代码示例说明如何正原创 2025-12-12 14:01:01 · 1000 阅读 · 0 评论 -
文件IO的常识
在Windows中默认的是\(反斜杠),因为Windows的前身的Dos系统,Dos系统就是通过\(反斜杠)来操作命令符的,但是也支持/(斜杠)基准路径是自己设定的,比如我可以设置C:/zhan为基准路径,这个时候我就可以使用./video来表示相对路径, .表示的是video的上一层。在编写代码的过程中,推荐使用的是/(斜杠),因为\(反斜杠)在编译器中可能会被当做转义语言,会导致很多麻烦。容量更小,读取速度是最快的,缺点也是数据的存储无法实现持久化,断电也gg。举例:E:\JAVAEE Reward。原创 2025-12-12 13:55:41 · 320 阅读 · 0 评论 -
JUC八股文
假设现在多个线程在进行读取的时候,有一个线程在进行修改,那么他就会拷贝一份新的去修改,其他线程在读取的时候,读取的就是旧的线程,等到新的线程改好之后,就会把引用指向新的修改好的线程,因为这个过程没有加锁,就不会产生阻塞,效率就自然而然高了。假设在某个操作中触发了hash扩容,那么他的扩容机制是这样的,会生成一个新的数组链表,新插入的插入在新的数组链表中,然后每次都在旧的数组链表中复制一部分过来新的这边,直到旧的全部复制完,此时就会销毁旧的数组链表。只要就是要使用try,finally去确保锁最后的释放。原创 2025-12-09 19:50:17 · 1083 阅读 · 0 评论 -
多线程CAS八股文
我们规定版本号从1开始,没进行一次修改那版本号就要加1,还是取钱的例子,首先,我们去取出500块,虽然我们多按了几次产生了多个线程,因为版本号的问题,我们一开始取出了500块这个时候版本号是1,而碰巧这个时候老妈给我转了500块,版本号是2,这个时候虽然账户变成了1000块,但是因为之前的线程针对的是版本号,所以他们会去比较版本号为1的时候的余额,发现这个时候确实是500,不是1000,所以就退出,也就可以规避CAS的ABA问题。点开具体的实现就会发现,这个就是调用了JVM封装好了的CAS。原创 2025-12-08 20:23:41 · 845 阅读 · 0 评论 -
多线程锁的八股文
首先,synchronize是自适应锁,在JVM中会自动统计竞争的激烈情况,所以不是乐观或者悲观锁的,其次,synchronize是互斥锁,不是读写锁,只要你对某个线程进行了加锁,不管另外一个线程的操作是不是原子性的都不允许进行,只能阻塞等待,再者,synchronize是可重入,在针对同一个线程加多次锁的情况下,会自动识别,最后,synchronize不是公平锁,看程序员怎么写就怎么调用。乐观锁:有两个线程,一把🔒,每个线程加锁的频率都很低,一个线程在加锁的时候,另外一个线程大概率不会和他竞争。原创 2025-12-07 19:22:38 · 1200 阅读 · 0 评论 -
JAVA定时器
这个任务类就非常简单,首先的核心的runnable任务的内容task,其次是任务等待的时间time,接着提供一个构造方法,初始化的时候传入任务的名字以及具体实现的内容run方法,接着给一个gettime的方法,获取到等待的时间,接着一个run方法,之所以在里面写一个run是为了在外部能够使用,接着实现一个comparable接口重写compareto方法进行比较。这里的逻辑很简答,先创建你一个任务类,先把那些传入的任务类写入到优先级队列就行,写入就可以唤醒等待的线程去做事情了。/*如何模拟实现一个定时器。原创 2025-12-06 13:25:14 · 1452 阅读 · 0 评论 -
JAVA线程池
举个例子:A是一个海王,A在谈恋爱的同时,和多个女生同时搞暧昧,只要他分手了,马上就可以找另外一个人谈恋爱,省去要从0开始的时间,因为A换女朋友的速度很多,所以同时聊了很多个备胎,这些备胎就构成了备胎池。一开始我之前说过,引入线程是因为进程的创建和销毁太慢了,占的资源又多,所以我们才引入了线程,因为要提升性能,所以我现在也觉得进程太慢了,所以就有了线程池。在公司中,当任务多的时候就找几个实习生,帮忙解决任务,当任务少了的时候也不会马上裁员,等几天,说不定会有新的任务,等确实没了就裁掉实习生。原创 2025-12-05 13:03:31 · 1015 阅读 · 0 评论 -
生产消费模型
很简单,整个代码都犯一个致命错误,因为当你使用if的时候,判断只有一次,也就是当size==0的时候,判断完开始wait之后就开始出问题了,继续往下走,完蛋,这个size==0会导致后续程序的执行修改掉一些数据,这个可是一个大问题哦。阻塞队列就好像是一个水库,在流量大的时候,会拦截下来大部分流量,让B按照自己的顺序去处理请求,这样就不会让B的压力爆骚缸,给B足够的时间去处理。一般来说A属于上游服务器,干的活就比较简单,消耗的资源少,但是B不一样,B需要做的事情比较麻烦,所以多个请求的时候,会压力爆骚缸。原创 2025-12-05 11:22:36 · 344 阅读 · 0 评论 -
JAVA单例模式
假如现在有两个线程同时调度,因为调度是随机的,可能一个线程刚开始创建instance,另外一个已经创建完了,这里就会出现不必要的创建,浪费资源,最后会被GC给回收掉,但确实是浪费了当时的资源,假如很大的情况下就会爆了。假设现在有两个线程,一个读取,一个修改,t1还在创建的时候,t2已经读取完了,这就导致之后的t2读取到的是还没初始化的对象,如何解决呢?将构造方法私有化,然后在一开始就把这个对象创建出来,因为是static修饰的,所以在程序一启动就被创建出来了,在外部无法创建新的对象。原创 2025-12-04 13:32:09 · 412 阅读 · 0 评论 -
WAIT和NOTIFY
在这里可以看出,只有一个锁,t1中wait的时候后续的代码是不执行先的他是优先释放锁给别人使用,否则t2是无法继续使用的,等t2中使用完再归还给t1。必须要搭配使用,最重要的一点就是这四处使用的锁名字必须一样,相当于他们沟通的桥梁,如果不使用一样的话就会出现没有任何影响和作用。前面已经解锁了,这个wait就没办法使用了,必须配套锁来使用,这个wait的第一步是先释放锁,能释放锁的前提是要有锁。按照之前的逻辑来说,有一个线程会先上锁,然后到wait的时候就开始解锁,之后等后一个走完再加锁。原创 2025-12-02 20:37:49 · 1315 阅读 · 0 评论 -
多线程安全问题
在这一行代码中,JVM能感知到load(读内存)的结果反复都是0,所以这个时候JVM就会把load这个操作给优化掉,变成cmp(读寄存器),因为读寄存器的速度要比读内存的速度快几千倍,加上一直读取到的是0,所以JVM就不会去内存读取,直接去寄存器去读,等到我们输入值的时候,t1线程就没办法感知了,因为我们修改的是内存的值,寄存器无法修改,如何应对呢?首先,就是容易忘记解锁,导致后续的线程都被卡住,其次就是解锁是写在最后的,要是中途return了或者抛异常了,那就是完蛋了,解锁都解不了。原创 2025-11-26 11:17:58 · 992 阅读 · 0 评论 -
线程的状态
线程的所有状态可以使用getstate获取到。原创 2025-11-25 09:56:25 · 461 阅读 · 0 评论 -
JAVA进程的基础概念
一台计算机的构成:CPU 存储器 输入设备 输出设备。原创 2025-11-22 14:08:23 · 357 阅读 · 0 评论 -
进程和线程
多线程:张三使用孙悟空给的毫毛,变出来很多个同类,如果这个时候少于十个人,那么效率就会提高,每个人只需要吃10只左右就行,但如果超过了10个,就会导致房间挤不下去,彼此之间就会相互影响,效率就会降低,或者是他们之间看上了同一个🐔,那么这个时候就会起冲突,(一个线程抛出异常,可能会导致其他线程也抛异常,甚至结束整个进程)就会导致。结果是两个都同时输出,并没有进入死循环,说明他就是一个多线程,这个打印并没有先后顺序,而是一个抢占式打印,谁先来就谁先打印。张三在一个房间,只能容纳10个人,要吃100只🐔。原创 2025-11-23 11:49:31 · 878 阅读 · 0 评论 -
Thread的创建方式
在JAVA中因为lambda表达式是回调函数,他的执行是很慢的,在系统创建出线程之后这个lambda才开始执行,当main方法执行完了,isfinished都被销毁了,lambda可能都还没找到,为了解决这种问题,在java中使用的方法是拷贝一份lambda无论外面是否销毁都不影响,但是同时,因为你是拷贝的如果外面修改或者是里面修改就会导致数据不一致的问题,所以在java中是不允许这样做的,所以就产生了叫做变量捕获的东西,意思就是在lambda中只能是常量或者不可变的变量。为什么在程序报错之后还能跑?原创 2025-11-24 11:50:23 · 1093 阅读 · 0 评论
分享