自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 深度挖掘《TCP与UDP》

比如你正在打游戏此时画面卡成ppt,也就是说在传输数据时丢失了。丢包是指在网络传输过程中,数据包因为各种原因没有正确地到达目标地点,而丢失的现象。在传输数据时,利用交换机和路由器每个设备都在承担很多转发任务,每个设备的转发能力是有上限的,当某一时刻某个设备流量达到峰值此时会引起丢包。如果包丢了,此时接受方就接收不到了,也就不会返回ACK,发送方就迟迟拿不到应答报文,此时等待一段时间还没收到,则认为是丢包。此时就会重新发一遍也称为“超时重传发送方对于丢包的判定,一段时间内没有收到ACK。

2023-07-23 17:50:28 511

原创 网络概念,《TCP/IP五层网络模型》与《数据的网络传输---“封装”与“分用”过程》

首先接收方物理层,网卡收到信号,对信号进行解析,还原成0101这样的数据,从物理层交给数据链路层此时就把该系列的数据当作一个以太网数据帧(此处是从以太网收到数据,就是要交给以太网协议来处理),把帧头和帧尾去掉取出中间的载荷,往上交给网络层,网络层的ip协议解析数据报,也是去掉ip报头,传输给传输层,传输层由udp来解析处理,去掉报头取出载荷把数据交给应用层,根据端口号来区分具体的应用程序,此时该应用程序解析数据报放到程序界面中。发送方发送数据,要把数据从上到下,依次交给对应的层次协议进行封装。

2023-07-21 18:28:36 323

原创 synchronized工作原理总结

锁升级是发生在运行时期机制,当没有进行线程任务时最开始状态是无锁状态,当线程执行任务时变成偏向锁,此时偏向锁并没有真正的加锁而是对该做个标记,当有其他线程竞争时标记检测到,此时第一个线程立即将锁装换成轻量级锁并且拿到锁,当竞争激烈时,转换成重量级锁。锁粗化:指的是锁的粒度,synchronized代码块,包含代码多少,代码越多,粒度越粗,代码越少粒度越小(串行代码少,并发执行代码多),但是如果某个场景要频繁加锁解锁,就将他转换成一个更粗粒度的锁。

2023-07-20 21:44:15 108

原创 基于TCP、UDP网络编程

socket对象:相当于对应到系统的一个特殊文件(socket文件),socket文件并非是对应到硬盘的某个区域,而是对应到网卡,所以,要想进行网络通信必须要有socket文件这样的对象,借助这个对象,才能间接操控网卡。往socket对象写数据,相当于通过网卡发送消息,从这个socket对象读数据,相当于通过网卡接受消息。程序员写网络程序,主要编写的应用层代码,真正要发这个数据,调用下层协议,应用层要调用传输层,传输层给应用层提供一组api称为。Socket:说明此对象是一个socket对象。

2023-05-26 20:48:37 1395

原创 《死锁》与《CAS ABA》问题

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。

2023-04-23 20:28:00 431

原创 常见的《锁策略》

表示在获取锁失败后,不会立刻放弃CPU,而是快速频繁的再次询问锁的持有状态一旦锁被释放了,就能立刻获取到锁,该类型的锁是轻量级锁的典型实现。总结:乐观锁和悲观锁,导致最终要做的事不一样,悲观锁要做的工作更多一些,效率低一些,乐观锁则会更少一些,效率更高一些(并不绝对)。这两个锁和乐观悲观不一回事,但是确实有一定重合,一个乐观锁可能也是一个轻量级锁,悲观锁也可能是一个重量级锁。synchronized:即属于乐观锁也属于悲观锁,即是轻量级锁也是重量级锁,即是自旋锁也是挂起等待锁。:读写锁维护了两个锁一个。

2023-04-23 19:32:31 541

原创 手把手带你了解《线程池》

假设,你的线程全是任务全是使用CPU密集型任务,线程数就不能超过核心数(逻辑核心数),如果是IO任务则可以超过核心数。线程池:提前把线程准备好,创建线程不是直接从系统申请,而是从池子里拿,线程不用了还给池子。从系统创建线程:涉及到用户态和内核态的切换,真正的切换是在内核态完成的。池的目的是提高效率,线程的创建虽然比进程轻量,频繁创建,开销也不可忽略。2、提升了任务响应速度,任务来了直接选一个线程执行而无需等待线程的创建。复用线程,平摊线程的创建与销毁的开销代价。2、添加的线程自己负责执行这个任务。

2023-04-20 16:59:46 395

原创 【模拟实现定时器】

定时器是一个闹钟,当时间到就可以执行一个指定代码。标准库 提供的定时器:Timer采用堆(优先级队列)结构即可!

2023-04-18 12:18:42 84

原创 阻塞队列的概念与使用(实现生产者消费者模型,模拟实现阻塞队列)

低耦合:两个模块之间关联性小,称为低耦合。高内聚:相关联的代码分门别类规制起来,称为高内聚。写代码要追求高内聚低耦合,避免代码牵一发动全身。上图直接通信,耦合度高上图没直接通信采用阻塞队列,耦合度低。

2023-04-17 21:19:41 143

原创 单例模式你真的懂了吗?

当我们有一个t1线程正在执行:创建内存->内存地址赋给引用时,突然调度给t2线程,t2线程执行时不为null,return走后执行某些操作时,因为我们还没调用构造方法赋值会导致出现问题。解决办法给引用添加volatile,加上后不优化了,也就不会导致指令重排序也保证了内存可见性问题,加锁也可保证了内存可见性。上述代码中:Instance=new Singletonlazy();注:当指令重排序后new操作执行顺序:创建内存->内存地址赋给引用->调用构造方法。单例模式:某个类,在进程中只能有一份实例。

2023-04-17 15:57:56 53

原创 wait和notify

线程的调度是无序的,但是有些场景,希望线程有序执行join算是一种但是功能有限wait:就是让某个线程先暂停等一等notify:就是让该线程唤醒,继续执行## Waitwait:发现条件不满足时/时机不成熟,就先阻塞等待。主要做三件事:wait必须写到synchronized代码块里面。1.解锁2.阻塞等待3.当收到通知,就唤醒,同时尝试重新获取锁notify:其他线程构造了一个成熟的条件,就可以唤醒。wait和notify是Object的方法notify:进行通知

2023-03-28 18:03:42 75

原创 什么是线程安全?

在单线程下安全,在多线程情况下不安全的事件。静态方法:属于类的,不依靠实例就可以调用,不能调用其他非静态方法,不能使用this,super关键字。类对象(对象的图纸):java源代码文件->.class文件,JVM就可以执行.class,JVM要想执行这个.class就要把文件内容读到内存中(类加载),类对象,就可以表示这个.class文件的内容,描述了类的详细属性:类名字、属性、方法、继承哪个类、实现哪个接口。

2023-03-28 16:56:37 83

原创 Thread 类的基本用法

由此可见是不可以的。此时我们通过t.start()就又创建出一个线程,线程和线程之间是并发的,每个线程之间又是一个独立的执行流。结论:我们发现两个线程是交替执行的(此处的交替不是严格意义上的交替),每一秒过后先打印谁是不确定的。上述代码的结果是不确定的(可能是先输出XYZ,也可能先执行ABC),因为线程之间是并发执行的。因为run方法是我们线程的入口方法,在此方法中完成我们想要执行的逻辑。让一个线程终止的方法就有一个办法,那就是让线程的入口方法执行完毕。run:线程的入口,线程执行的逻辑。

2023-03-24 20:23:47 178

原创 进程和线程的概念(超详细)

3、文件描述符表 :进程每次打开一个文件,就会产生一个“文件标识符”(标识了这个被打开的文件),一个进程可能会打开很多文件,对应了一组文件描述符,把这些文件描述符放到一个顺序表这样的结构里,就构成 “文件描述符表”,总结也就是说:进程运行的时候,使用了那些硬盘上的资源。一个进程存在则必定会有一个PCB(若一个进程有多个线程就有多个PCB),PCB是进程存在的唯一的标志, 如果进程消失, 则对应PCB也随之消失,操作系统用PCB来描述进程的基本情况以及运行变化过程。进程比较重量,频繁创建销毁,成本高。

2023-03-22 21:06:34 121

原创 超硬核!史上最好的数据库总结

数据结构研究的是数据如何组织,对于少量数据不需要组织,但是对于大量数据而言,就需要好好组织以便于后续的增删改查。数据库是管理/组织/保存数据的软件,这些数据也是为了后续进行增删改查操作。

2023-03-19 15:41:44 773

原创 内部类讲解

因为静态成员变量是属于类的,不是属于方法的(这里我们将内部类想象成是一个方法更容易理解)。4)外部类不能直接访问内部类的成员变量和方法,需要实例化内部类才可访问。4)实例化外部类对象后,能够访问到private修饰的成员变量和方法。2)可以直接调用外部类静态成员和方法,能够定义静态成员和方法。静态内部类不需要要有外部类的对象才能实例化,因为它是静态的。3)若需要使用外部类成员变量和方法需要实例化外部类对象。如果内部类成员和外部类成员名重名时我们该如何处理呢?4)局部内部类能直接访问外部类的成员变量和方法。

2022-12-14 12:42:43 143 1

原创 Java实现通讯录

AddPerson类实现了IMainList接口,主要重写方法,增加联系人操作。IMainList是一个接口主要实现通过向上转型调用某个功能。前言:通讯录非常适合前期需要练习语法的小伙伴,效果非常好。定义了联系人数组用于存放联系人信息,和菜单功能。水再浑浊,只要长久沉淀,依然会分外清澈。人再愚钝,只要足够努力,一样能改写命运。联系人包含姓名、电话号、出生年月信息。对联系人进行排序(通过年份排序)显示已有联系人的信息。

2022-12-13 15:52:12 3745 3

原创 类和对象(详细讲解)

类是对一个实体(对象)的描述,主要描述该实体(对象)的属性和功能。如:洗衣机,可以将它看作一个类,具有的属性:品牌,颜色,尺寸等。功能:洗衣服,甩干等功能。//属性 public int age;//功能 System . out . println("正在授课");System . out . println("正在吃饭");} }

2022-11-17 13:27:16 208 2

原创 JAVA代码块讲解

静态变量存放在方法区,静态方法/(变量)只会调用一次其次具有资源共享的作用,注意点:因为共用一个,一个更改全部更改。当实例化两个或多个对象的时,静态变量/方法只调用一次,第二个之后将不再调用。♦️在静态方法中,不能引用成员变量(没有被static修饰的变量)。static修饰的变量/方法不依赖于对象,随着类的加载而存在。♦️在静态方法中,可以引用类变量(static修饰的变量)。➡️类变量可以通过类名.类变量调用,也可以对象.类变量调用。🔸在普通方法中,可以引用类变量和成员变量。static被称为静态。

2022-11-10 23:48:43 550 4

原创 java的数据类型与运算符讲解~

编译生成字节码文件(二进制文件.class) JAVA运行程序,会运行到JVM上。.java为源文件。一次编译,到处运行 class定义的称为类,class后为类名,类名采用大驼峰规范,例如:MaxNum publicclass定义的类名必须和文件名保持一致 public访问修饰限定符基本数据类型分为8种类型。

2022-10-29 22:25:28 115 5

原创 【C语言】数据的存储

E:在存储时会将原E的值加上(127/1023)(若是float+127,double+1023)进行存储,E是无符号数,若是(8位)范围0~255,若是11位范围0~2047。M:因为规定M一定是1开头所以在存储时,默认舍弃目的就是多出一位空间使数据更加的精确,比如1.011只存储011,当把存储数据读出时,再将第一位的1加上去。这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将 有效数字M前加上第一位的1。(-1)^S表示符号位,当S=0,V为正数;...

2022-08-29 17:01:36 279

原创 十六进制字符串转换成十进制数

减'0'的目的就是将arr[i]中的字符转化成数字 假设字符串是123转换成10进制 循环第一圈:m=0*16+1; 第二圈:m=1*16+2; 第三圈:m=(1*16+2)*16+3,这不就相当于(1*16^2)+(2*16^1)+(3*16^0) 结果为:291 m=m*16+arr[i]-'A'+10; 这里为什么要加10因为A在10进制中表示10 比如:假设arr[i]='C'; arr[i]-'A'+10 = 'C'-'A'+10 = 12 12不就对应16进制中的C....

2022-08-26 23:27:16 6518 4

原创 【C语言】操作符讲解

移位操作符分为左移操作符和右移操作符,移位操作符的操作数必须为整数,移动的是二进制位。15----假设是int型变量,int类型在内存中占用4字节,32个bit。有符号数整形提升补符号位,无符号数补0,截断是在补码的基础上进行截断。15----十进制(1* 10^1)+(5*10 ^0 )17----八进制(1 * 8^1)+(5 * 8 ^0)若结果补码为负数,输出是按原码输出,内存中存放的是补码。其中正数的原反补相同,符号位为0是正数,为1是负数。&运算规则:全1出1,有0出0,二进制补码运算。...

2022-08-26 16:07:33 324 1

原创 【C语言】深入理解指针

指针就是地址,int a;a是整形变量,而int* p=&a;(给指针p赋值是给p一个地址) 带*就代表是一个指针是int类型指针是存放int类型数据的指针,指针能够通过地址解引用获取到变量值,也能通过指针修改对应地址的值。指针更多的功能往下看我会一一讲解。* 号用于定义指针和解引用操作,当 int a = 10;就能通过 * 号通过地址找到存放的值如 printf("%d" , * p);屏幕会显示a变量中存放的值。...

2022-08-25 21:33:12 356 8

原创 srand和rand详细讲解

在rand调用之前设置srand,若不设置当rand调用时随机数种子默认为1,随机数种子一样则每次打印出来的值也是一样的。srand不要重复定义否则会导致rand()输出的值并不随机且相等。rand产生随机数,范围rand()会返回一个范围在0到RAND_MAX(至少32767)之间的伪随机数。伪随机(pseudorandom)就是由算法生成的随机数,真随机是真正随机的数。如上所示,我们给一个持续变化的量,什么是持续变化的量呢?使用srand引用头文件#include......

2022-08-11 20:42:23 3464 4

原创 sizeof和strlen超详细讲解,看完一定有所收获

sizeof与strlen超详细讲解

2022-07-30 13:20:31 170

原创 c语言经典50道例题---精华篇

c语言经典50道例题---精华篇

2022-07-20 17:44:30 2204 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除