- 博客(19)
- 收藏
- 关注
原创 网络协议——HTTP协议
简单说,当你访问网站时,网站通过浏览器在你的设备上留下Cookie(小型文本文件),这些文件就存放在浏览器的指定存储位置,属于本地设备上的数据,而非网站服务器上的数据。浏览器访问sougou.com的时候,会把HTTP请求先发送给Fiddler,Fiddler再把请求发送给服务器,当服务器返回数据的时候,Fiddler拿到返回的数据,再把数据交给浏览器。当我们输入一个URL进行访问,URL中的ip定位到服务器主机,port定位到程序,path定位到程序管理的资源,出现404表示访问的资源在服务器上没有。
2025-08-12 20:14:16
364
原创 网络编程——套接字
Socket类是客户端socket,或服务器端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。计算机中的“文件”,是一个广义的概念,文件还能代指一些硬件设备(操作系统管理硬件设备,也是抽象成文件,统一管理的)。UDP协议是用来操作网卡的,将网卡抽象成socket文件,操作网卡的时候,流程和操作普通文件差不多。不管是客户端还是服务器端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。这是抽象的概念,指的是虚拟的/逻辑上的连接。
2025-08-05 19:47:00
1204
1
原创 初识网络原理
于是进行拆分,把一个大的协议拆分成若干个小的,功能单一的协议,然后把这些协议进行归类,也就是。有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制0/1数据来传输,如何告诉对方发送的数据是什么样的呢?协议分层后,只有相邻两层协议之间能进行交互,上层协议可以调用下层协议,下层协议可以为上层协议提供服务(协议之间的交互,不能跨层进行)。当应用程序获取到用户的输入,就会构建一个应用层的数据包,这个应用层数据包就会遵守应用层协议,按照约定的格式,将数据打包。
2025-07-21 16:19:39
1073
原创 文件操作&IO整合
不管是字节流还是字符流,在读写文件时,代码是差不多的。对于读入文件,在while中主要有read()和read(byte/char[]b)两种方式:read()反复地读取文件,返回值n是读取到的字节数据,当n=-1时表示文件读取完成。read(byte/char[]b)在read()的基础上,使用了缓存区byte/char[]b,read(byte/char[]b)将读取到的字节数据存到缓存区中,返回值len为读取到的数据个数,当len=-1时表示文件读取完成。对于写出文件。
2025-07-18 00:19:01
1079
原创 Java IO流
不管是字节流还是字符流,在读写文件时,代码是差不多的。对于读入文件read()反复地读取文件,返回值n是读取到的字节数据,当n=-1时表示文件读取完成。read(byte/char[]b)在read()的基础上,使用了缓存区byte/char[]b,read(byte/char[]b)将读取到的字节数据存到缓存区中,返回值len为读取到的数据个数,当len=-1时表示文件读取完成。对于写出文件,有writer()和writer(byte/char[]b)两种方式。
2025-07-16 23:05:51
837
原创 多线程进阶——线程安全的集合类
原来的集合类,大部分都不是线程安全的。Vector, Stack, HashTable, 是线程安全的(不建议用),其他集合类不是线程安全的。
2025-07-14 20:16:59
893
原创 多线程进阶——JUC的常见类
因为 Callable 往往是在另一个线程中执行的,啥时候执行完并不确定。Callable 描述的是带有返回值的任务,Runnable 描述的是不带返回值的任务。如果不使用Callable和FutureTask,则要考虑线程同步的问题,要等执行运算的线程结束后,再执行main线程里的输出结果。等价于“锁”(普通的信号量,就相当于锁的更广泛推广),如果是普通的N的信号量,就可以限制同时有多少个线程来执行某个逻辑。使用多线程,经常把一个大的任务拆分成多个子任务,使用多线程执行这些子任务,从而提高程序的效率。
2025-07-12 21:58:30
808
原创 多线程进阶——CAS
CAS:全称Compare and swap,字面意思:“比较与交换”,一个CAS涉及到以下操作:假设内存中的原数据V,旧的预期值A,需要修改的新值B1.比较A与V是否相等。(比较)2.如果比较相等,讲B写入V。(交换)3.返回操作是否成功。实际上,CAS操作是原子的,是一条cpu指令。// Swapaddress理解成内存中的值,expectValue为寄存器中的值,swapValue为另一个寄存器中的值。
2025-07-07 20:43:49
857
原创 多线程案例——线程池、定时器
老板还是很善于变通的,知道了为什么大家都要雇人了,所以指定了一个指标,公司业务人员会扩张到 3 个人,但还是随着业务逐步雇人。于是再有业务来了,老板就看,如果现在公司还没 3 个人,就雇一个人去送递,否则只是把业务放到一个本本上,等着3 个快递人员空闲的时候去处理。这个类比我们平时来一个任务,起一个线程进行处理的模式。构造方法的名字是固定的,想要提供不同的版本,就需要通过重载,有时候不一定能构成,所以有了工厂模式。表示核心线程数,线程池一创建,这些线程也随之创建,直到整个线程池销毁,这些线程才会销毁。
2025-06-28 11:16:58
671
原创 多线程案例——单例模式、阻塞队列
单例模式是校招中最常考的之一.单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例单例模式最常见的实现方法分为“饿汉”和“懒汉”模式饿汉模式和懒汉模式是单例设计模式的两种不同实现方式,主要区别在于实例化的时机和线程安全性。
2025-06-20 14:17:34
750
原创 多线程之——wait和notify
"在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁。使用wait后,如果其他线程完成了必要的工作,调用notify唤醒wait线程,wait就会解除阻塞重新获取到锁,继续执行并返回。t1,t2,t3线程都会依次进行阻塞等待,t4线程执行notifyAll后,唤醒所有阻塞的线程。在这个代码中,执行到wait时当前线程就会阻塞等待,要先释放锁,给了其他线程获取锁的机会。,不保证等待线程的执行顺序。
2025-06-17 10:56:17
985
原创 多线程中的风险-线程安全问题
在这个例子中,由于指令重排序,writer方法中的操作1、2、3可能被重排序为3、1、2,导致reader方法看到ready为true时,x仍为0。在每次进入循环后,都休眠1秒,单位时间内循环次数就大大减少了,所以当修改flag的值,JVM依旧执行读取内存操作,就能结束t1线程。线程的调度是随机的,随时发生上面的各种情况,只有少数情况下,操作是正确执行的,所以实际结果<=预测结果。在短时间内,这个循环会执行很多次,执行过程中,JVM就能感知到 读取操作反复执行的结果好像都是一样的,
2025-06-16 22:54:24
769
原创 线程安全问题——加锁
但是释放第一个锁也是由该线程来完成的,结果这个线程已经躺平了,啥都不想干了,也就无法进行解锁操作. 这时候就会。如果某个线程加锁的时候,发现锁已经被人占用,但占用的正是自己,那么仍然可以继续获取到锁,并让计数器自增。这个对象的类型是啥不重要,重要的是,要有多个线程尝试对这同一个对象加锁(竞争同一个锁)一个线程加上了锁,另一个线程就会阻塞等待,等到第一个线程释放锁,才有机会执行。解锁的时候,当计数器递减为0时,才真正释放锁(此时其他线程才能获取到锁)。多把锁之间要约定好加锁解锁的顺序,就可以破除循环等待了。
2025-06-15 14:46:35
1345
原创 多线程的实现及Thread成员方法
每次执行线程里循环时,大部分时间都是在sleep,此时我们在主线程里调用interrput,极大概率下t线程都正在sleep中,在slepp时终止线程,会唤醒sleep,sleep会抛出异常。当sleep出现异常时,才会执行catch里的值,我们在这里实现手动退出,说明这里sleep会出现异常,并且线程也没有因为interrupt直接结束。之前我们已经看到了如何通过覆写 run 方法创建一个线程对象,run是线程的入口方法不需要手动调动,但线程对象被创建出来并不意味着线程就开始运行了。
2025-06-14 21:14:04
1234
原创 多线程的基本概念和特点
线程是由进程引出的一个概念,对于进程来说,通过多进程编程的方式,可以实现“并发编程”的效果。在这个过程中,进程是一个比较“重”的概念:创建进程/销毁进程的开销都比较大,为了解决这个问题,引出了“线程”,轻量级进程,使得创建销毁的开销更小。
2025-06-14 00:05:13
701
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人