- 博客(51)
- 收藏
- 关注
转载 java JUC 线程中断唤醒机制 面试必备
首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制----中断,也即中断标识协商机制中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自行实现。
2024-02-28 20:08:09
836
原创 算法:动态规划全解(上)
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。
2024-02-28 18:45:00
2184
原创 操作系统虚拟内存(下)
我们就可以利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(多级页表虽然解决了空间上的问题,但是虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销。程序是有局部性的,即在一段时间内,整个程序的执行仅限于程序中的某一部分。有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。
2024-02-22 22:15:12
397
原创 操作系统虚拟内存(上)
如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃,所以想要在这种情况下,在内存中同时运行两个程序是不可能的。
2024-02-22 18:32:58
727
原创 【每日一个知识点】谈谈前端性能监控和性能分析工具,你在项目中使用过哪些?
前端性能监控和性能分析工具是用于测量、监控和分析网页性能的工具,它们帮助开发团队了解网页加载和渲染过程中的性能瓶颈,从而优化用户体验和提升页面性能。
2024-02-01 20:32:32
354
转载 java JUC 线程中断机制 面试必备
首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制----中断,也即中断标识协商机制中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自行实现。
2024-01-31 12:15:00
1613
原创 【已解决】pnpm:无法加载文件.\Roaming\npm/pnpm.ps1,因为在此系统上禁止运行脚本。ps:请参阅https:/go .microsoft.com/fwlink/?LinkID=1
pnpm无法使用的问题。
2024-01-30 16:00:31
728
原创 Vue3组件通信 详解(下)
注意:子组件中不用编写任何东西,是不受到任何打扰的。是一个对象,包含所有父组件传入的标签属性。中声明的属性(可以认为声明过的。被子组件自己“消费”了)【第一步】父组件中,使用。配置向后代组件提供数据。【第二步】孙组件中使用。
2024-01-30 12:30:57
514
原创 死锁及排查
死锁是指两个或两个以上的线程在执行过程中,因抢夺资源而造成的一种互相等待的现象,若无外力干涉,则它们无法再继续推进下去。jconsole工具。
2024-01-30 10:51:49
265
原创 常见的锁类型
不会添加锁,Java中使用无锁编程来实现,只是在更新的时候去判断,之前有没有别的线程更新了这个数据,如果这个数据没有被更新,当前线程将自己修改的数据成功写入,如果已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如:放弃修改、重试抢锁等等。仔细想想,其实没有必要一直去尝试加锁,因为只要锁的持有状态没有改变,加锁操作就肯定是失败的。,不加锁的特性能够使其读操作的性能大幅提升,乐观锁则直接去操作同步资源,是一种无锁算法,得之我幸不得我命---佛系锁。版本号机制Version。
2024-01-29 19:29:06
814
原创 Vue3组件通信 详解(上)
子组件中:使用“defineEmits”定义事件命名为“Xxx”子组件中:调用事件“Xxx”,将数据传递出去父组件中:调用组件,绑定事件“Xxx”,接受数据。
2024-01-29 12:15:00
481
原创 TCP半链接和全链接队列实验(下)
假设条件 1 当前半连接队列的长度 「没有超过」理论的半连接队列最大值 max_qlen_log,那么如果条件 3 成立,则依然会丢弃 SYN 包,也就会使得服务端处于 SYN_RECV 状态的最大个数不会是理论值 max_qlen_log。在前面我们测试的结果,服务端处于 SYN_RECV 状态的最大个数是 193,正好是触发了条件 3,所以处于 SYN_RECV 状态的个数还没到「理论半连接队列最大值 256」,就已经把 SYN 包丢弃了。
2024-01-28 12:30:00
1872
原创 TCP半链接和全链接队列实验(上)
半连接队列,也称 SYN 队列;全连接队列,也称 accept 队列;服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调用 accept 函数时把连接取出来。不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。
2024-01-28 12:15:00
2022
原创 Vue 插槽讲解
Slot 通俗的理解就是“占坑”,在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中slot位置)并且可以作为承载分发内容的出口。简单的来说为了更加抽象的去复用组件而诞生的功能。
2024-01-27 18:49:07
520
原创 Vue3 pinia全解(上)
我们都知道Vuex在Vue2中主要充当状态管理的角色,所谓状态管理,简单来说就是一个存储数据的地方,存放在Vuex中的数据在各个组件中都能访问到,它是Vue生态中重要的组成部分。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。从上面官网的解释不难看出,pinia和Vuex的作用是一样的,它也充当的是一个存储数据的作用,存储在pinia的数据允许我们在各个组件中使用。的实体,每个组件都可以。
2024-01-27 17:58:42
703
原创 Vue3生命周期 VS Vue2生命周期(小记)
会在合适的时机,调用特定的函数,从而让开发者有机会在特定阶段运行自己的代码,这些特定的函数统称为:生命周期钩子。组件实例在创建时要经历一系列的初始化步骤,在此过程中。,每个阶段都有两个钩子,一前一后。
2024-01-26 22:36:40
403
原创 TS基本类型的响应式数据
作用:将一个响应式对象中的每一个属性,转换为。若需要一个响应式对象,且层级较深,推荐使用。若需要一个基本类型的响应式数据,必须使用。接收的是对象类型,内部其实也是调用了。定义的响应式数据是“深层次”的。若需要一个响应式对象,层级不深,的实例对象,简称:响应式对象。(基本类型不要用它,要用。重新分配一个新对象,会。
2024-01-26 12:15:00
409
原创 TS基础知识点快速回顾(下)
定义⼀个函数或类时,有些情况下⽆法确定其中要使⽤的具体类型(返回值、参数、属性的类型不能确定),此时就需要泛型了。抽象类:不能去实例化,但可以被别⼈继承,抽象类⾥有抽象⽅法。就是泛型,(不⼀定⾮叫T ),设置泛型后即可在函数中使⽤。可以有普通⽅法,也可以有抽象⽅法;⾃定义类型,可以更灵活的限制类。仅仅就是⾃定义类型;当⾃定义类型去使⽤;关键字去继承抽象类;
2024-01-25 20:25:46
415
原创 TS基础知识点快速回顾(上)
TypeScript,简称 ts,是微软开发的一种静态的编程语言,它是 JavaScript 的超集。那么它有什么特别之处呢?
2024-01-25 20:12:22
953
原创 Socket多进程模型
这种用多个进程来应付多个客户端的方式,在应对 100 个客户端还是可行的,但是当客户端数量高达一万时,肯定扛不住的,因为每产生一个进程,必会占据一定的系统资源,而且进程间上下文切换的“包袱”是很重的,性能会大打折扣。父进程则相反,将客户服务交给子进程来处理,因此父进程不需要关心「已连接 Socket」,只需要关心「监听 Socket」。另外,当「子进程」退出时,实际上内核里还会保留该进程的一些信息,也是会占用内存的,如果不做好“回收”工作,就会变成。来区分是父进程还是子进程,如果返回值是 0,则是子进程;
2024-01-24 21:16:18
555
原创 Socket 文件描述符
数组的下标是文件描述符,是一个整数,而数组的内容是一个指针,指向内核中所有打开的文件的列表,也就是说内核可以通过文件描述符找到对应打开的文件。协议栈采用的是分层结构,上层向下层传递数据时需要增加包头,下层向上层数据时又需要去掉包头,如果每一层都用一个结构体,那在层之间传递数据的时候,就要发生多次拷贝,这将大大降低 CPU 效率。然后每个文件都有一个 inode,Socket 文件的 inode 指向了内核中的 Socket 结构,在这个结构体里有两个队列,分别是。,这个两个队列里面保存的是一个个。
2024-01-24 21:09:06
594
原创 基本的 Socket 模型
Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“口子”,双方读取和发送数据的时候,都通过这个“口子”。这样一看,是不是觉得很像弄了一根网线,一头插在客户端,一头插在服务端,然后进行通信。创建 Socket 的时候,可以指定网络层使用的是 IPv4 还是 IPv6,传输层使用的是 TCP 还是 UDP。
2024-01-22 23:23:47
430
原创 grpc java 编译小记
这是Apache Tomcat的一个库,提供了Java注解API的实现。在Java 9+中,您需要将此依赖项添加到您的项目中,以便在构建和运行时正确处理注解。- 这是gRPC框架的一个库,提供对Protocol Buffers的支持,用于定义消息格式和服务接口。- 这是gRPC框架的一个库,提供自动生成的客户端和服务器存根,用于在gRPC服务之间进行通信。- 这是gRPC框架的一个库,提供Netty实现以支持gRPC的网络通信。
2024-01-22 19:34:05
402
原创 线程和进程的区别(从JVM角度出发)
在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。需要注意的是,如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。
2024-01-17 23:25:23
639
原创 TCP的这些特性你知道吗?(流量控制篇)
让我们想想如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。那么为了解决这种现象的发生,TCP提供一种机制能够让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
2024-01-17 23:10:56
507
原创 JVM运行时数据区(下篇)
ps:jdk8运行时数据区指的是JVM所管理的内存区域,其中分成两大类:线程共享 –方法区、堆方法区:存放每一个加载的类的元信息、运行时常量池、字符串常量池。堆:存放创建出来的对象。线程不共享 –本地方法栈、虚拟机栈、程序计数器本地方法栈和虚拟机栈都存放了线程中执行方法时需要使用的基础数据。程序计数器存放了当前线程执行的字节码指令在内存中的地址。直接内存主要是NIO使用,由操作系统直接管理,不属于JVM内存。
2024-01-14 21:39:46
554
1
原创 JVM(字节码文件详解)
jclasslib的Github地址: https://github.com/ingokegel/jclasslib。在讲解字节码文件组成前,可以安装使用“”插件进行字节码文件查看。”工具或idea中“
2024-01-12 18:24:19
543
原创 JVM运行时数据区(上篇)
Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。方法出口指的是方法在正确或者异常结束时,当前栈帧会被弹出,同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中,需要存储此方法出口的地址。当前类的字节码指令引用了其他类的属性或者方法时,需要将符号引用(编号)转换成对应的运行时常量池中的内存地址。
2024-01-12 17:22:13
1259
原创 JVM初识
JVM全称是Java Virtual Machine,中文译名Java虚拟机。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。
2024-01-11 22:27:51
492
1
原创 TCP的这些特性你知道吗?(拥塞控制篇)
加入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。拥塞窗口cwndcwndcwnd。
2024-01-10 12:15:00
1561
原创 TCP的这些特性你知道吗?(滑动窗口篇)
如果每次 [发送方] 需要等待接受方返回数据才能发送下一条数据,会导致网络通信的效率非常的低,于是在TCP中 引入了这个概念,即使在往返时间较长的情况下,它也不会降低网络通信的效率。有了窗口,并不代表可以无限 接受,所以要指定窗口大小(窗口大小就是指假设窗口大小为3个 TCP 段,那么发送方就可以「连续发送」3个 TCP 段,并且中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」。
2024-01-09 16:02:06
541
原创 TCP的这些特性你知道吗?(重传机制篇)
D-SACK可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;可以知道是不是「发送方」的数据包被网络延迟了;可以知道网络中是不是把「发送方」的数据包给复制了;ps:在 Linux 下可以通过参数开启/关闭这个功能(Linux 2.4 后默认打开)。
2024-01-09 14:43:46
978
原创 TCP/IP 网络模型
TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。应用层专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。我们电脑或手机使用的应用软件都是在应用层实现。应用层是不用去关心数据是如何传输的,就类似于,我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快递是如何被运输的。传输层代表协议:分别是 TCP 和 UDP。当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢
2024-01-08 21:46:06
887
原创 redo,binlog的两阶段提交
把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功。内部 XA 事务由 binlog 作为协调者,存储引擎是参与者。
2024-01-08 13:14:35
1046
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人