java-ee
文章平均质量分 79
十一.
不懂编程的菜鸟
展开
-
HTTP!!!
7) 片段标识符区分页面中的不同部分(文档类网站)原创 2024-06-16 10:54:03 · 682 阅读 · 1 评论 -
IP协议报文格式
总长度,去掉IP报头长度,就是IP载荷长度,而IP载荷是由TCP/UDP报头+ TCP/UDP载荷组成,所以去掉TCP/UDP报头长度,剩下的就是载荷长度了.IP协自身实现了拆包,组包这样的功能,如果数据包的长度超过上限,IP数据包就会自动拆分成多个数据包,每个数据包携带一部分,发送到对方后,再拼接好.32位范围: 0 - 42亿9千万,原则上.IP地址应该是唯一的,不重复的,但32位仍然不够用,尤其是现在处于移动互联网的今天.一个数据包在分用的时候,要交给上层的哪个协议,都是有明确的声明的,原创 2024-06-10 23:14:45 · 943 阅读 · 1 评论 -
IP协议(二)
如果不存在,就会从周围的设备中,挑选一个"最神通广大"的设备,吧这个数据交给这个最神通广大的设备,这个最神通广大的设备就会查找自己的路由表中是否存在目的IP,如果存在,直接转发即可,如果不存在,则把数据交给他周围设备中"最神通广大"的设备…以此类推直到找到目的IP.在网络中,路由器的寻路,则无法做到"最优解",只能做到"较优解",因为每一台路由器,无法知道整个网络的"全貌",但是可以知道它附近的设备是咋样的.子网掩码 . . . . . . . . . . . . : 255.255.0.0。原创 2024-06-10 23:14:23 · 665 阅读 · 0 评论 -
TCP的核心属性
比如: A和B建立了TCP连接,A这边关机了,A关机之前,告诉B,发送fin,B这边收到了fin,B返回ACK,代码进入下一阶段流程,准备发送fin,但如果A关机了,也就意味着B 接下来的 fin 不会收到ACK,B的fin就会反复重传几次, 如果B仍然没收到ACK,还是继续把A给删除, A都已经关机了,之前保存的B的信息,自然也没了.B给A发了一个心跳包,如果A正常,A就会回应ACK,如果A挂了,B就不会收到任何回应.连续发了若干次,A都没有回应,这个时候B认为A挂了,于是单方面是否连接.原创 2024-06-05 19:43:13 · 1401 阅读 · 0 评论 -
IP && 端口号
服务器是不能直接通过调试器去调试(调试器一调试就会把服务器阻塞住,无法给别的客户端提供服务了),而是通过网络的方式,给服务器发调试请求,服务器会返回对应的关键信息,这样的端口称为"调试端口"这样的操作,经常会通过网络来进行操作,服务器就会另外绑定一个端口号,称为"管理端口",程序员想对这个服务器进行管理操作,就通过管理端口给服务器发送一些对应的请求,然后服务器就会执行对应的逻辑.把小于1024的端口号拿出来,称为"知名端口号",把这些端口号分配给一些比较知名的服务器程序,作为这些服务器的"默认端口号".原创 2024-04-30 21:44:19 · 757 阅读 · 1 评论 -
UDP!!!
假如全世界都是用同一个操作系统,升级的成本相对来说会小一点.但市面上存在各种各样的操作系统,如果某个操作系统升级了,其他系统没有升级,意味着这个升级的系统和其他系统。比如:电信号表示 0 , 1 ,低电平表示 0, 高电平表示1 ,此时传输的过程中,遇到一一个变化的磁场,此时就可能把本来的低电平变成高电平/高电平变成低电平。(3)不可逆 : 通过原数据,计算 md5 ,成本很低,但通过 md5 ,还原成原来的数据,成本很高,仅仅理论上可行)但升级报头,不是技术上的难题,更多的上政治上的难题.原创 2024-04-30 21:43:44 · 1250 阅读 · 0 评论 -
震惊!!!原来这就是操作系统
CPU,内存,硬盘…这些都是硬件,而操作系统就是软件,可以让计算机按照一定的规则进行执行.软件是一组指令的集合,原创 2024-03-21 22:54:45 · 329 阅读 · 1 评论 -
震惊!!!原来计算机是这样工作的!
大家都知道电脑是计算机!但计算机不仅仅是电脑!!!手机,平板,智能手表,电视,路由器,智能冰箱,智能洗衣机,智能空调…这些都可以称为计算机.原创 2024-03-21 22:56:11 · 687 阅读 · 3 评论 -
线程与进程的爱恨情仇???
创建线程,资源已经在创建进程的时候进行分配了(同一个进程,包含多个线程,这些线程之间是共用资源,只有在创建第一个线程的时候(也就是创建进程的时候),去进行资源申请操作,后序在创建线程,都没有申请资源的过程了)但上面的方法会产生一定的问题,比如:如果一个服务器,频繁的有客户端“来来去去”,服务器也就需要频繁的创建/销毁进程(开销比较大),进而会导致服务器的响应速度变慢.1:同一个进程不同线程之间,是共用相同的内存资源和文件资源的(不同进程的内存指针和文件描述符表是同一个).8:一个跑起来的程序就是一个进程.原创 2024-03-24 20:04:22 · 266 阅读 · 3 评论 -
多线程编程--线程的创建
像run()这种方法,只是定义好,而不是 手动调用,把这个方法的调用,交给系统/其他的库/其他框架(别人)调用,这样的方法称为"回调函数".上面有两个线程,一个是我们手动创建的,一个是main线程,main线程又称为主线程。原创 2024-03-27 23:20:07 · 351 阅读 · 0 评论 -
原来这就是线程安全(一)
i < 50000;});i < 50000;});t1.start();t2.start();t1.join();t2.join();上面的代码可能我们以为最终的count=100000;但最终小于100000,这就是线程安全在搞鬼.因为线程是随机调度 的,抢占式执行,就会使代码执行结果不可控,结果也就是随机的.我们往往希望结果使我们所预期的,而这种不可控,随机的执行结果就称为bug.原创 2024-03-29 19:24:32 · 1209 阅读 · 1 评论 -
线程中的核心操作
核心思路:需要让终止的线程的入口的方法尽快执行结束,(跳出循环,尽快return 都可以).try {});i < 3;原创 2024-03-29 19:26:16 · 862 阅读 · 6 评论 -
线程安全(二)--死锁
);上述代码:thread一共加了两次锁,第一次加锁,肯定是能够成功的,但当第二次加锁的时候,此时,第一次加锁后,还未进行解锁操作,那么第二次加锁操作就不能获得锁对象,就会加锁失败,那么该线程就会进入阻塞等待,等待到第一次加锁 操作完了,释放锁操作,但第一次的操作要释放锁,那么必须执行完第二次加锁,解锁操作(代码顺序执行).原创 2024-03-30 21:39:39 · 1170 阅读 · 0 评论 -
线程的等待通知机制
假设有3个滑稽,1号滑稽在ATM中取钱,2,3号滑稽只能在门口阻塞等待,1号滑稽发现ATM中没钱了,就从ATM中出来了,在2号滑稽进去之前,1号滑稽又进去了,2号又只能阻塞等待,1号发现仍然没钱,又出来了,然后再2号进去之前,1号 又进去了,就这样,1号进进出出,其他滑稽只能阻塞等待.因为t1 ,t2执行抢占式执行,执行顺序不确定,那么就有可能t2先执行了notify,此时t1还没wait,那么notify就不会有任何效果(也不会抛异常),但是后续t1进入wait()之后,就没有人能够唤醒了.原创 2024-03-31 15:40:15 · 834 阅读 · 2 评论 -
内存可见性
同时,JVM发现每次load执行的结果,是一样的(t2线程修改之前),因此,**JVM就把上述load操作优化掉了,只是第一次真正进行load,后续再执行到load,而是直接读取已经load过的寄存器中的值了(读取寄存器的速度远远大于 读取内存的速度).**当t2线程修改count的值,但由于t1线程并没有从内存中重新读取,所以获取不到更新后的值.然而,一个load指令消耗的时间,会比一个cmp指令消耗的时间多得多,执行一次load的时间,等于上万次cmp执行消耗的时间.原创 2024-03-31 15:41:27 · 401 阅读 · 10 评论 -
震惊!!原来阻塞队列&&消息队列这样理解会更简单!!!
正常情况下,A收到一个客户端请求,就同样请求一次B,A收到的请求多了,B的请求也就会增多,但由于A做的工作比较简单,消耗的资源比较少,B做的工作复杂,消耗的资源比较多,一旦请求量大了,B服务器就容易崩(服务器每次处理一个请求,都会消耗一定的系统资源,如果同一时刻,要处理的请求太多,消耗的总资源数目超出机器能提供的上限,机器可能就会卡死).即使上图:检查心脏的人,排在第二位,但医生没有喊"检查心脏的患者,那检查心脏的患者"只能继续等待,而检查肾,做产检的患者,按照顺序看医生.2:能够让程序"削峰填谷"原创 2024-04-04 19:06:45 · 408 阅读 · 1 评论 -
震惊!!!原来这就是单例模式!!!
单例模式是一种典型的设计模式.设计模式就是为解决编程中的一些典型问题,提供的一些解决方案.遇到这个情景,遇到这个问题,代码应该怎么写,效率更高,能够更好的解决这个问题.在进程中的某个类,有且只有一个对象(不能new出来对个对象),这样的对象,就称为"单例".但如何保证一个类只有一个实例???此时就需要通过一些编程上的技巧,使编译器能够自动发现代码中是否有多个实例,并且在尝试创建多个实例的时候,直接编译出错.从代码上保证单例,这种代码就称为单例模式。原创 2024-04-04 19:07:37 · 825 阅读 · 8 评论 -
线程池的模拟实现
(2)submit的时候,先判定当前任务队列是否已经比较多了,(自行设定一个阈值)(3)如果确实比较多了,根据刚才构造时指定的拒绝策略,执行不同的逻辑。就需要引入更多的数据结构了,也需要引入"定时器"的概念.(1)构造方法里面提供参数.用参数来表示哪种拒绝策略.b)直接在submit中调用Runnable的run。c)删除队列的队首元素(可以删多个,也可以删一个)(2)有任务队列(使用Runnab即可)实现拒绝策略的核心,在submit这里.d)丢弃当前元素,不添加到队列中.(3)提供submit方法。原创 2024-04-11 23:51:48 · 392 阅读 · 0 评论 -
震惊,线程池参数讲的这么明白!!!!
如果当前添加的任务比较少,4个线程就足以能够处理,就只有4个线程在工作了,如果添加的任务比较多,4个线程处理不过来了(有很多线程在排队等待执行),这个过程,线程池就会自动创建出新的线程,来支撑更多的任务.(但创建出来的线程总数,不能超过最大线程数).由于代码大部分都是在等待,那么瓶颈就不在CPU上,每个线程只消耗CPU一点点,更多考虑的是其他方面(比如网络程序,要考虑网卡带宽的瓶颈(比如网卡是1Gbps,一个线程读写速率是100Mbps,最多搞10个线程))这种程序一跑,就能立即吃满一个CPU核心.原创 2024-04-11 23:52:28 · 971 阅读 · 0 评论 -
synchronized的优化策略
首次使用synchronized对对象进行加锁的时候,不是真的加锁,而只是做一个"标记"(非常轻量,几乎没有开销),如果没有别的线程尝试对这个对象加锁,就可以保持这个状态,一直到解锁(解锁也就是修改一个上述标记,也几乎没有开销).本质上,偏向锁策略就是"懒"字具体体现,能不加锁,就不加锁,能晚加锁,就晚加锁,在很多时候能够把加锁的开销给省下.锁的粒度:指的是:加锁的范围内,包含多少代码,包含的代码越多,锁的粒度就越粗,反之,锁的粒度就越细.有一天,领导给你安排了三个工作,你做完了,要给领导汇报工作.原创 2024-04-12 23:01:44 · 336 阅读 · 1 评论 -
深入理解synchronized
偏向锁:首次使用synchronizd对对象进行加锁的时候,并不是真的加锁,而只是做一个"标记"(非常轻量,非常快,几乎没有开销),如果后面没有其他线程尝试对这个对象加锁,就可以保持这个状态,一直到解锁,(解锁也就是修改一下上述标记,也几乎没有开销),但是,如果在偏向锁的状态下,有某个线程也尝试对这个锁对象进行加锁,立刻就把偏向锁升级成轻量锁(真的加锁了,真的有互斥了).上述锁升级过程,针对一个锁对象来说,是不可逆的,只能升级,不能降级,一旦升级到了重量级锁,就不会回退到轻量级锁(当前JVM的做法).原创 2024-04-15 08:40:58 · 838 阅读 · 1 评论 -
多线程小问题
sleep被调用后当前线程进入TIMED_WAIT状态,不涉及锁相关的操作;start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。wait必须在synchronized修饰的代码块或方法中使用,sleep方法可以在任何位置使用;wait是Object类中的一个方法,sleep是Thread类中的一个方法;run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;原创 2024-04-12 23:07:27 · 294 阅读 · 2 评论 -
PCB&&进程调度
在任务管理器中,可以看到,系统中包含了很多的进程,而且每个进程都需要执行,执行就需要占用CPU资源,去CPU上执行.但进程的数量,远远多于多核CPU的数量.此时就需要进程调度来协调了.原创 2024-03-24 19:02:18 · 392 阅读 · 0 评论