JavaEE初阶
文章平均质量分 88
关于初阶学习的总结
良月初十♧
嗯哼嗯哼蹦擦擦,哦耶哦喽哦买噶
展开
-
JVM(Java虚拟机)详解
整个一个大块的内存,不是很好用,但是如果把整个内存空间隔成了很多个区域,然后每个区域都有不同的作用,此时这块很大的内存就显得很有条理性,并且在每个内存的区域使用的时候是不会相互干扰的。所以针对不同的业务需要和功能就对内存划分出了不同区域的内存空间。JVM也就是启动的时候会申请一整个很大的内存区域,JVM是一个应用程序,当JVM运行在操作系统上的时候,也是要从操作系统中申请内存的,然后JVM就要根据把整个空间,分成几个部分,每个部分各自有不同的功能作用。原创 2023-07-08 20:29:49 · 4571 阅读 · 0 评论 -
Cookie和session工作流程详解
前言虽然大部分客户端的数据都是从服务器中请求的,但是还有一小部分数据为了减轻服务器的负担,这一部分数据可以在浏览器本地中进行数据存储,如果此时的数据需要本地存储,是否可以直接写入硬盘呢,答案是否定的,如果允许网站直接把数据写入硬盘,此时有一些恶意网站就可能攻击客户端,把硬盘上的数据弄丢。所以引入了。原创 2023-06-05 16:50:54 · 1000 阅读 · 1 评论 -
HTTPS详解
HTTPS引入的对称 加密 + 非对称加密 + 证书 ,这一套流程,不仅仅是HTTPS回涉及到,其他的场景中也会用到;HTTPS = HTTP + SSL(对称加密和非对称加密也是一个协议,称作SSL);所以现在的应用层的协议基本都是用的HTTPS这个比较安全的协议,如果浏览器访问的一个请求是HTTP协议的,此时浏览器会给报出一个 ”存在风险“ 的 弹窗。原创 2023-05-24 21:40:26 · 481 阅读 · 2 评论 -
HTTP 协议详解 和 fiddler 的用法
前言。原创 2023-05-23 17:34:21 · 180 阅读 · 0 评论 -
CSS 选择器的常见用法
前言CSS在编写代码的时候有很多种样式,和和HTML,JS相似,他们都是运行在浏览器中的,下面就介绍一下CSS选择器的常见用法。原创 2023-05-22 10:42:38 · 1032 阅读 · 1 评论 -
TCP/IP协议详解(3)
目录1. 在NAT机制下网络如何进行通信?2. IP地址的组成 (1)IP地址分为两个部分,网络号和主机号。(2)网络号和主机号的区分3. 特殊的IP地址 (假设子网掩码都是255.255.255.0)4. IPv6数据链路层1.报文格式:如下图;2. IP协议如何分包: 下图详解;3. IP分包重组的过程前言 上一篇文章讲到了IP协议的两种机制: 注:只要求外网IP是唯一的,内网在不同的局域网中式可以重复的(同一个局域网中不能重复)。 续上一篇文章继续讲接下来的内容原创 2023-05-13 17:39:59 · 116 阅读 · 1 评论 -
TCP/IP详解(2)
如下图:原创 2023-05-12 15:09:20 · 204 阅读 · 1 评论 -
File 类的用法和 InputStream, OutputStream 的用法
为啥它是一个抽象类呢?(1)一个字节(byte)可以表示整数的范围就是 -128 ~ +127,如果是无符号就是0 ~ 255,此时表示的范围是 0 ~ 255 ,但是后边又说了,如果读到这个文件的最后一个字节(就是读完文件时),要用 -1 来返回,也就是说要用一个byte之外的数字来返回,代表读完了这个文件,所以此时byte就超范围了,所以此时用int来接收这个read的字节。接下来就是Java操作文件内容了,标准库种提供了两种类,在介绍这两组类之前,要分清啥是输入和输出,认清楚方向: 下图解释了。原创 2023-05-04 17:32:52 · 613 阅读 · 0 评论 -
UDP、TCP/IP详解
前言首先这两个协议在前文中已经简单介绍过了,但是学习协议一个重要的环节就是认识这个报文的格式是啥(就是数据是如何进行组织的)原创 2023-05-10 16:27:22 · 994 阅读 · 6 评论 -
基于TCP实现客户端服务器交互
前言 (加粗字体为重点部分) 上一篇文章讲到了socket(套接字)api 网络编程,主要是介绍了一些概念,udp和tcp实现客户端服务器的交互代码(代码逻辑只是一个回显的过程,主要是掌握客户端和服务器之间交互的流程) socket(套接字)是操作系统给应用程序提供的一组用于网络编程的API,程序猿写的代码主要是基于应用层的,就是接收的数据要拿来干啥用,但是数据的传输也是和传输层紧密联系的,所以掌握和理解传输层的一些核心协议和机制是很有必要的。 Java标准库中提原创 2023-05-09 17:49:03 · 460 阅读 · 0 评论 -
网络初识,网络协议和套接字编程
一个是无参数的(通常用于客户端),有端口号版本的(用于服务器端),因为客户端不需要指定端口号,系统会给你分配一个空闲的端口号用来请求数据,但是服务器不一样,你要请求数据,就要知道服务器的地址才能请求,而服务器的端口号必须是不变的,好比食堂新开了餐馆(就是一个服务器),顾客就是对应的客户端,顾客每次去吃饭不一定就是坐在原来的位置(有一个空闲的位置即可,就是那个空闲的端口),但是餐馆的位置(服务器的端口)不能改变,要不然顾客下次再来吃饭去哪里找?类比下物流快递,这个就是高速公路,最后快递要落实到这里进行传输。原创 2023-05-07 16:59:11 · 103 阅读 · 0 评论 -
IO、存储、硬盘、文件系统操作
Java标准库中提供了File这个类,就是用来操作系统的文件的(例如Java代码操作创建文件删除文件),这个类对象就像是硬盘上的文件的一个抽象表示,在Java中直接操作硬盘上的文件不是很方便,就创建出这样的一个对象,操作这个对象就可以简介的影响硬盘上的文件,可以类比一下,看电视的时候都会有遥控器,同时也可以去按 电视上的按钮去换台,但是不方便呀,有了遥控器我就不用来回跑了,此时这个Filie对象就是一把遥控器~~二进制文件存储的是二进制的数据(没有各种字符集编码的限制),存储啥都可以。主要区分硬盘和内存,原创 2023-05-03 22:00:21 · 103 阅读 · 0 评论 -
HashMap, HashTable, ConcurrentHashMap 之间的区别
此时就不只是有一把锁了,把每个链表的头节点当成锁锁对象,操作不同的链表就是操作不同的锁对象,(注:两个线程针对同一个锁对象加锁才会产生锁竞争,针对不同的锁对象加锁是没有锁竞争的),这里的加锁概率就大大降低了,不产生锁竞争我就不加锁,甚至我加了锁也只是一个偏向锁,有了锁竞争,我再升级~(ConcurrenthashMap是非常来灵活的加锁,所以推荐使用此种方案解决线程安全问题)如果两个线程插入两个元素,两个元素在不同的链表上,(两个线程修改不同的变量)此时本身就是线程安全的,那还加锁干啥呢~~原创 2023-05-03 11:58:34 · 51 阅读 · 0 评论 -
多线程总结单例模式的写法
所以在写懒汉模式时,要将懒汉模式变成线程安全的,就要进行加锁操作,让if判定和instance赋值变成一个原子操作,但是加锁是会进行阻塞的,只要线程阻塞,效率就会降低,所以我们可以看下,只有第一次new对象的时候会出现线程不安全,但是只要创建出来了这个对象,以后也就线程安全了,所以我们再加一个判断条件,判断是否需要加锁,当instance是空的时候,如果两个线程并发执行,就不是线程安全的,但是new了唯一对象之后,instance就不空了,就不会进行new操作了,此时就是线程安全的了。原创 2023-04-25 23:42:16 · 58 阅读 · 0 评论 -
Thread类的基本用法
所以我们要是想让新线程先执行咋办呢,这就 涉及到了线程的等待:Thread类总的join方法,这个方法是可以规定哪一个线程先执行的,还是这个代码我们在主线程中加一行代码,就可以让新的线程先执行,新的线程执行完然后执行主线程,注意,哪个在哪个线程中加入这个方法,就是让线程进行等待(阻塞状态)。这是创建了一个新线程,那先执行新的线程还是执行主线程,答案是不确定,先执行谁都是有可能的,此时的新线程和主线程是并发(并行+并发)执行的,而系统的调度是无序的,所以先执行哪一个线程都有可能。原创 2023-04-22 18:00:20 · 53 阅读 · 0 评论 -
总结多线程中wait,notify的使用
在t1线程中调用wait方法,就会让这个线程进行阻塞状态,暂时不参与CPU的调度执行,此时t2线程就可以执行了,那t2线程的逻辑执行完了,需要让t1这个线程再继续执行,就需要通知t1线程,用notify方法,告诉t1线程,此时你可以继续执行了。join方法是让两个线程完整的执行串行,有t1和t2两个线程,要等t1线程完全执行完了才让t2线程继续执行,而wait notify方法是让t1线程执行一部分,然后让t2线程开始执行,然后再让t1线程继续执行,再让t2线程执行.........原创 2023-04-24 22:13:38 · 80 阅读 · 0 评论 -
Java线程中的几种状态总结
此时我们可以看到,t1这个线程正在指定时间等待着,因为同时给t1和t2线程加锁,并且是同一个锁对象,此时t1线程进入while循环后,绝大部分时间是在sleep的,所以t1这个线程是TIME_WAITING状态,t2线程是正在阻塞的,因为加锁了,并且是对同一个锁对象进行加锁,所以就会产生锁竞争,此时t2线程就会进入阻塞状态,等待t1线程执行完毕之后,t2线程才会开始执行。此时t1线程运行结束了,但是Thread这个对象还在,所以状态就是TERMINATED。原创 2023-04-23 17:06:36 · 173 阅读 · 0 评论 -
Java多线程安全的原因和解决问题的方案总结
由于线程和线程之间的执行顺序是无序的,是抢占式执行的,所以系统调度执行线程式随机的。(导致不安全最重要的一点)解决方案:加入Thread类中的join方法,(在哪个线程中加入join方法,就让哪个线程进行等待)让一个线程等待另一个线程执行完毕之后,这个线程再开始执行,此时就会从并发变成完整的串行执行了。原创 2023-04-23 18:52:38 · 182 阅读 · 0 评论 -
Java线程池总结
(此处要重点掌握)(下面会介绍工厂模式)所有工厂模式的方法都是基于ThreadPoolExecutor类进一步进行封装的,可以看下Java官方文档:corePoolSize:核心线程数maximumPoolSize:最大线程数这两个参数就是如果把线程池比作一个公司,核心线程数就相当于是正式员工,最大线程数就是 正式员工 + 临时工(就是随时可以辞退的那种)。如果当前这个线程池中任务是较多的,线程池就会多创建一些”临时线程“,然后等任务比较少了,再把这些临时线程销毁掉。原创 2023-05-01 11:05:43 · 37 阅读 · 0 评论 -
锁策略和 cas 优化过程
如果不加锁,多个线程之间执行是并发的,很可能编译器从原来的内存中读变量优化成从寄存器中读变量,此时会出bug,但是引入cas的优化之后,可以不加锁,然后进行比较,如果寄存器A中的值现在加到了2,写回了内存M中,同时t2线程也正在进行操作,就先不进行++操作,先比较一下A和M中的值是否是相等的,如果是相等的就说明A已经对M中的值进行了自增,那B就是把自己寄存器中的值更新成M的值,然后在这个基础上再进行自增,此时多线程安全问题就解决了。),只要约定的版本号只能是递增的,就可以保证不会出现aba来回变的情况了。原创 2023-05-02 21:57:32 · 153 阅读 · 0 评论 -
死锁的原因和解决方案
1. 一个线程,一把锁。如下图代码:首先synchronized是针对put方法加锁,如果同时啊hi要对里面的size方法加锁,此时就会产生死锁(如果是可重入锁没事(synchronized属于可重入锁),对于不可重入锁就会死锁)。此时就是对一个线程加锁两次的情况,第二次尝试加锁,需要等待第一个锁释放,第一个锁释放,要等待第二个锁加锁成功。逻辑上是矛盾的,就会进入死锁状态。原创 2023-05-01 23:49:24 · 149 阅读 · 0 评论 -
Java中的synchronized
自旋锁vs等待挂起锁:自旋锁是轻量级锁的一种典型的实现,等待挂起锁是重量级锁的一种典型实现。如果没有人来获取这把锁,我就先加个标签,说我要获取这把锁了哈,其实我并没有进行加锁这个操作,只是进行了加标签操作,然后进入观察状态,看看有没有线程来和我进行锁竞争,如果有,我就卡卡加上锁,如果没有线程来竞争,我就只是做了一步加标签的操作。乐观锁 vs 悲观锁:Java中的机制就是锁的实现者先来一波预测,如果预测下来发生锁竞争的概率不大,就判定此时是一个乐观锁,如果判定发生锁竞争的概率大,此时就是一个悲观锁。原创 2023-05-02 10:38:13 · 118 阅读 · 0 评论