自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux服务器 | 17.设置虚拟内存

其中bs是每块的大小,count是块的数量;bs * count 就是swap文件的大小:这里1M*4096=4G。可以根据需要自行调整。输入下方指令编辑 fstab 文件,并删掉先前追加的内容。使用下方指令编辑 fstab 文件。输入下方指令查看内存使用情况。输入下方指令重启服务器。

2023-02-22 21:24:25 1944 1

原创 Java并发 | 23.[设计模式] 保护性暂停

当 response 被成功赋值,此时就应该将waitSet中的所有线程唤醒,因此调用了notifyAll( )。若线程在检测到自己的 response 接收到之后,就会跳出 while 循环;而没有接收到 response 的线程将重新进入 while 循环,并重新进入 TIMED_WAITING 状态;保护性暂停模式是让一个线程等待另一个线程的结果。java中的join、Future、FutureTask均采用了该模式实现。若线程是因超出了等待时间而被唤醒,那仍然满足 while 条件,但会进入。

2022-09-06 01:28:53 457

原创 Java并发 | 22.[方法] 调用wait( )和notify( )的正确姿势

obj.wait( )、obj.wait( long m )、obj.notify( )、obj.notifyAll( ) 执行的前提都是必须先持有锁,因此所有涉及这些方法的代码块都需要被。小明(线程A)需要有泡面才能正常工作,小红(线程B)需要有奶茶才能正常工作;小明和小红在启动后,需要分别判断是否满足条件,满足时工作,否则偷懒。注:为了模拟“避免线程安全问题”,所有的线程内部代码块都要用。其他人(线程C、D、E)则比较勤快,但需等待1s后才能工作;张总(主线程)负责为他俩购买泡面和奶茶;

2022-09-04 22:47:25 458

原创 Java并发 | 21.[方法] wait( )、wait(long m)、notify( )、notifyAll( )

以下四个方法都是操作「当前对象obj对应的Monitor对象(之后简称当前对象锁)」中的 Owner 或 WaitSet。这些方法执行的前提都是当前线程必须持有锁。方法签名功能概述备注使当前对象锁中Owner进入WAITING状态当前线程必须要持有锁使当前对象锁中Owner进入状态当前线程必须要持有锁,m毫秒后会自动唤醒唤醒当前对象锁中WaiSet的随机一个线程当前线程必须要持有锁唤醒当前对象锁中WaiSet的所有线程当前线程必须要持有锁。

2022-09-04 22:46:43 321

原创 Java并发 | 19.[锁机制] 偏向锁(CAS)

第一个线程上锁]线程 t1 访问 obj 的MarkWord,发现它并没有被任何线程绑定,于是将自己的线程ID标记上去;[t1再次执行]t1 执行结束后不会执行任何解锁操作。当它再次执行代码块时,发现线程ID与自己的匹配,于是直接执行;[t2竞争锁]若 t1 已停止,则认为不会产生竞争,t2 将 MarkWord 的线程ID换成自己的;若 t1 仍活跃,说明产生了竞争,则会将锁升级为轻量级锁。

2022-09-02 01:19:47 770

原创 Java并发 | 18.[锁机制] 轻量级锁(CAS+自旋锁)

在轻量级锁机制中,则是判断 obj 中 Mark Word 是否为 "指向LockRecord"的指针,若不是,则将当前线程中 “LockRecord 里指向自己的指针” 与 MarkWord 交换。若发生了锁竞争(线程t2尝试CAS失败,并发现对象头中指针指向的LockRecord并不属于自己),那线程t2就会循环。轻量级锁使用CAS和自旋锁来获取锁,避免了向操作系统申请 Monitor 对象,从而减少性能消耗。中对重量级锁进行过解析,需要实现重量级锁,就要向操作系统申请一个 Monitor 对象。

2022-09-01 23:19:10 1252 1

原创 Java并发 | 17.[锁机制] 重量级锁(Monitor+自旋锁)

Monitor译为「监视器」或「管程」,此类对象由操作系统提供,每个Java对象都可以关联一个 Monitor 对象。Java对象与Monitor对象是一一对应的。如果使用给一个Java对象上了锁(重量级锁),该Java对象头中的 MarkWord 对应的指针就会指向一个唯一的 Monitor 对象。Monitor中有三个变量,分别是Owner、EntryList和WaitSet,本文暂不讨论WaitSet[Owner]当某个线程拥有锁,那么 Owner 就会指向该线程,表示只允许该线程执行代码块。

2022-09-01 18:16:51 595

原创 Java并发 | 16.[基础] synchronized简述

上文提到,「多个线程」「读写」「共享资源」时发生了指令交错,就可能出现线程安全问题。「互斥锁当存在多个线程操作共享数据时,需要保证同一时刻只有一个线程正在操作该数据,而其他线程必须等该线程处理完毕才能执行。当一个线程希望执行被修饰的代码块时,会先尝试获取相应的锁对象obj,并根据是否成功获取该对象而进行不同的操作(直接执行、自旋、锁升级、阻塞等)......

2022-09-01 17:20:08 408

原创 Java并发 | 15.[基础] 线程安全分析

String、Integer等都是不可变类,这些类底层数据是被 final 修饰的,所有的操作要么只读,要么创建一个新的对象,因此它们的方法都是线程安全的。」时发生了指令交错,就可能出现线程安全问题。,即可判断是否线程安全。...

2022-09-01 17:19:33 216

原创 Java并发 | 14.[基础] 线程安全问题、临界区、竞态条件

多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了「多个线程 读写 共享资源时发生了指令交错,就可能出现线程安全问题。错误执行时,得到了错误的结果1。正确执行时,结果应该为0。如果一段代码块内存在。,就称这段代码块为「...

2022-08-31 01:12:03 225

原创 Java并发 | 13.[设计模式] 两阶段终止线程

在真正执行操作之前,先判断该线程是否曾被打断(curThread.isInterrupted( )),一旦检测到被打断,则将当前锁住的所有资源释放,料理完所有后事后,自主停止线程。需要注意,如果线程在休眠状态被打断,通常需要在 catch 代码块中将打断标记重新设为true,以确保下次能进入if代码块。第一个阶段只是发出指令,第二个阶段则是目标线程针对发出的指令,先「将终止线程拆分成两个阶段,给需要终止的线程一个 “若在此之前线程锁住了共享资源,在它被杀死后就。,其他线程将永远无法获取锁。...

2022-08-31 01:09:10 204

原创 Java并发 | 12.[方法] interrupt( )打断

如果希望在 main 线程中获取 t1 的打断标记,直接调用。如果希望获取本线程的打断标记,则需要先通过。

2022-08-31 01:07:47 276

原创 Java并发 | 11.[方法] join( )和join( long m )等待线程执行完毕

二者的基本作用都是「让调用者等待该线程对象执行完毕至多会让调用者等待m毫秒。若m毫秒过去线程依旧没有结束,则不再等待;join( )会让调用者进入Waiting状态,而则会进入状态。

2022-08-31 01:07:12 256

原创 Java并发 | 10.[方法] 静态方法sleep( long m )休眠

状态的线程不会被分配到时间片。该方法会抛出 InterrptedException,因此要对其进行捕捉。状态的线程被打断时,就会抛出 InterrptedException,且打断标记会被重置为false。这是一个静态方法,作用是「...

2022-08-31 01:05:20 821

原创 Java并发 | 09.[方法] run( )与start( )

中的代码块,并不能达到异步开启多线程以提高效率的目的。,这样的话并不会启动新的线程,而是在主线程中执行了。倘若子线程 t1 尚未启动,主线程却调用了。此时的线程 t1 将停留在。在创建线程后,线程就处于。...

2022-08-31 01:03:45 176

原创 Java并发 | 08.[方法] 线程的生命周期及常用的方法

值得一提的是,在操作系统中有Ready和Running状态,但在JVM中将这两种状态合并成了。

2022-08-30 02:51:55 358

原创 Java并发 | 07.[应用] Linux系统下查看和杀死进程

该命令隶属于jdk,可以直接看到所有的java进程,且这些进程会以入口的类名命名,Windows下也可以执行该命令。其实功能与Windows系统下的。与Windows下的。

2022-08-26 01:14:18 669

原创 Java并发 | 06.[应用] Windows系统下查看和杀死进程

该命令隶属于jdk,可以直接看到所有的java进程,且这些进程会以入口的类名命名,Linux下也可以执行该命令。win + R 输入 “cmd” 打开命令提示符窗口,随后输入相应的指令就能看到进程的信息。值得一提的是,PID指的是进程ID,而不是端口号,详见文章。......

2022-08-26 01:13:40 1071

原创 Java并发 | 05.[应用] PID、PPID与端口号

每当进程启动,操作系统都会赋予该进程一个唯一的PID。当进程死亡,这个PID就会被回收以被新的进程使用。杀死进程通常会以PID作为参数。每一个服务都会绑定一个端口号,不管是在服务器还是在电脑都是一样,比如 MySQL 通常绑定 3306,Web服务通常绑定 80。需要注意,启动一个程序后,通常会启动多个进程,因为通常一个服务是由若干个进程共同协作组成的。(也就相当于是一个新的进程了)。因此这些线程会有一个。在Linux系统中,当一个进程启动了多个线程,每个。用以标识它隶属于哪个父进程。...........

2022-08-26 01:12:36 818

原创 Java并发 | 04.[基础] 创建线程

FutureTask实现了Runnable接口,而FutureTask的构造函数中,需要传入一个Callable接口对象,而Callable接口对象需要实现。若接口被 @FunctionalInterface 修饰,且这个接口只有一个 abstract 方法,就可以使用lambda表达式简写。可以像这样,先创建Runnable接口对象,并实现其中的 void run( ) 方法,再将这个对象传入线程。创建线程时,我们只需要传递一个。即可创建一个线程,再通过。( ) 来执行线程任务。.........

2022-08-08 20:48:08 185

原创 Java并发 | 03.[基础] 同步与异步

以用户上传文件举例:

2022-08-08 20:47:02 221

原创 Java并发 | 02.[基础] CPU与内核、并发与并行、上下文切换

若「线程A」抢到了「内核①」的「时间片1」,意味着在这段时间内,「线程A」将独享「内核①」。从宏观的角度看是并行的(因为时间片很短,大约是15ms,人能感知的时间段大约为100ms,而100ms内CPU进行了若干次上下文切换,人很难感知这样的差距);据此,可以总结:线程的上下文切换是指CPU内核的上下文(某个线程在某一时刻的运行条件与状态)发生了变换。简单来说,一个CPU具有一或多个内核,而指令的执行是由其中的某个内核处理的。不同线程中的指令流。,在其中的任一一个时刻,这些线程都是同时被执行的。......

2022-08-08 20:46:08 308

原创 Java并发 | 01.[基础] 进程与线程概述

过程与定义」当一个程序被运行,其代码从磁盘被加载到内存中,这时就开启了一个进程;「作用」进程的作用是加载指令、管理内存和管理IO;「与线程的关系」进程可以看做是线程的集合;「补充」进程可以视为是程序的一个实例,大部分程序允许同时运行多个实例进程(比如,你可以连续两次运行"记事本"程序,此时就会开启两个"记事本"进程)。「与进程的关系 & 定义」线程存在于进程之中,一个进程有一到多个线程;「作用」将线程中的指令流以一定的顺序交由CPU去执行(换句话说,最终的执行是由线程提交的);「补充」......

2022-08-08 20:45:24 92

原创 计算机网络 | 10.[TCP篇] TCP连接的断开(四次挥手)

所谓四次挥手,是指客户端和服务端在断开TCP连接的过程中,总共发送了四个消息。其中双方都可以主动断开连接。这里以客户端主动断开连接为例,展示四次挥手的完整流程:概述:客户端向服务端发送FIN表示消息发送完毕,服务端回复ACK表示收到,待服务端将剩余的消息处理完毕,就发送FIN表示消息发送完毕,最终由客户端回复ACK,连接正式断开。「为什么第一次挥手要有ACK=1」因为在发起第一次挥手之前,也会有服务端发送的消息,需要对它进行确认;「为什么第三次挥手没有ACK=1?......

2022-08-05 19:04:08 1073

原创 计算机网络 | 09.[TCP篇] TCP连接的建立(三次握手)

所谓三次握手,是指客户端和服务端在建立TCP连接的过程中,总共发送了三个TCP 报文。完整流程可见下图:概述:客户端向服务端发送SYN报文表示希望建立连接,服务端返回ACK+SYN报文表示收到并同样希望建立连接,最后由客户端发送ACK报文表示最终确认。...

2022-08-05 19:03:31 1462

原创 计算机网络 | 08.[TCP篇] TCP概述

TCP 基本认识TCP是面向连接的、可靠的、基于字节流的传输层通信协议。[面向连接的]必须是「一对一」的连接,不能像UDP协议那样一个主机同时向多个主机发送消息;[可靠的]TCP协议有非常多复杂的机制来「保证报文一定被送达」;[字节流]消息会被切割并以流的形式进行传输。......

2022-08-05 18:52:36 497

原创 计算机网络 | 07.[HTTP篇]HTTP/1.0、HTTP/1.1和HTTP/2.0

随后服务端在第二个流中,将后续即将被加载的js、css等文件发送给客户端,而客户端则会将这部分数据缓存起来,一会儿要用的时候,直接从缓存中获取。指在同一个 TCP连接 中,客户端可以连续发起多个请求,只要第一个请求成功发送,不必等待它的响应,就可以继续发送第二个请求,从而。在HTTP/1.1中,数据传输使用「文本」的形式,在另一方接收到数据后,需要先将文本转成二进制,才能正常解析;若某一个请求的响应由于某种原因无法及时返回,队中其他请求的响应将会被阻塞,这就是HTTP/1.1「」并以不确定的顺序发送。...

2022-08-03 23:33:23 451

原创 计算机网络 | 06.[HTTP篇] HTTP/1.1如何优化

另外由于 HTTP/1.1 是请求响应模型,如果第一个发送的请求,未收到对应的响应,那么后续的请求就不会发送,于是为了防止单个请求的阻塞,所以一般浏览器会同时发起 5-6 个请求,每一个请求都是不同的 TCP 连接,那么如果合并了请求,也就会。对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都。如果把多个访问小文件的请求合并成一个大的请求,虽然传输的总资源还是一样,但是减少请求,也就意味着。当用户滑动到页面的时候,再加载其附近的数据,实现资源的「...

2022-08-03 03:04:23 173

原创 计算机网络 | 05.[HTTP] SSL/TLS握手过程

客户端收到消息后,会使用内置的「CA公钥」解密数字证书,验证数字证书的真伪。是客户端使用公钥加密后传递给服务端的,服务端再使用私钥解密,就能重新得到。告知服务端握手结束,并将之前所有数据用哈希函数计算哈希值,再使用「告知客户端握手结束,并将之前所有数据用哈希函数计算哈希值,再使用「而一旦服务器的私钥被泄露,过去截获的所有TLS密文都将被破解。,并结合先前生成的两个随机数,根据加密算法计算出「,因此某一次通信的私钥被泄露并不会造成太大的影响。服务器收到客户端发起的消息后,向客户端发出。...

2022-08-03 03:03:35 823

原创 计算机网络 | 04.[HTTP篇] HTTP与HTTPS

通过混合加密、数字签名和数字证书来规避窃听风险、篡改风险和冒充风险。HTTPS传输数据过程中,即用到了非对称加密,也用到了对称加密;尽管有了混合加密和数字签名,但依旧无法确保传输是安全的;大致流程可见下图,但其实还有一些细节是不够准确的,如。据此,引入第三方机构:CA(数字证书认证机构),不被篡改,在发送数据的同时,也将数据对应的。对称加密是指在对数据进行加密时,双方都使用。非对称加密是指在对数据进行加密时,双方使用。」(通常是服务端,需要保密),另一方则持有「仅由CA持有,因此无法被任何人伪造。...

2022-08-03 03:02:38 111

原创 计算机网络 | 03.[HTTP篇] HTTP缓存技术

强缓存和协商缓存缓存类型获取资源形式状态码是否发送请求到服务器强缓存从缓存取否,直接从缓存取协商缓存从缓存取是,通过服务器来告知缓存是否可用。

2022-08-03 03:00:53 151

原创 计算机网络 | 02.[HTTP篇] 请求方式

理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。进行UrlEncode加密(将参数对应的字符串转换成二进制数组,随后根据UrlEncode编码表,将这个二进制数组解析成不会产生歧义的字符)另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。由于URL仅支持可见的ASCII码(也就是仅支持不产生歧义的字符),因此会对。根据RPC规范,GET的语义是。该行为会对资源做出修改,因此是。.

2022-08-03 03:00:10 190

原创 计算机网络 | 01.[HTTP篇] 什么是HTTP、常见状态码、常见头部字段

什么是HTTP超文本 传输 协议,其具体的定义如下:HTTP是专门在两点之间传输文字、图片、音频、视频等超文本数据的一套行为约定和规范。[超文本]:不仅局限于普通文本的文本,即为超文本,可以是文字、图片、音频、视频、超链接的混合体,其中最具代表性的就是HTML;[传输]:两点之间双向传输数据(服务器 浏览器、服务器服务器);[协议]:一套行为约定和规范。.........

2022-08-03 02:47:32 463

原创 编程随笔-Java | 04.栈Stack、队列Queue和双端队列Deque

泛型类型必须被指定为引用数据类型。使用LinkedList实现即可,这也几乎是LinkedList最常见的用途了。双端队列同样使用LinkedList。

2022-07-27 02:09:29 178

原创 编程随笔-Java | 03.使用FileWriter向文件中写入内容

代码】编程随笔-Java|03.使用FileWriter向文件中写入内容。

2022-07-27 02:08:12 2690

原创 编程随笔-Java | 02.File类常用API

不推荐直接在路径字符串中写“\”,因为部分操作系统无法识别。更好的做法是使用静态常量,在下文会有介绍。}//1.根据路径创建对象StringabsPath="E//绝对路径Filefile1=newFile(absPath);//相对路径,此时会在这个路径的前面拼接项目根目录Filefile2=newFile(relPath);//2.根据两段路径创建对象(parent和child),会自动实现拼接StringdirAbsPath="E。...

2022-07-27 02:06:59 111

原创 编程随笔-Java | 01.System.getProperty(“user.dir“) 获取项目根目录

如此获取到的是这个项目的根目录,但需要注意,并不是执行程序所在的目录。

2022-07-27 02:00:23 332

原创 Kubernetes | 02.搭建Kubernetes集群

视频:2.安装Kubernetes集群文档:安装Kubernetes集群[minikube] - 仅测试使用K8S集群模拟器,部署时只需要一台机器(即只有一个节点),Master和Worker都在一起,仅作测试使用;[云服务器可视化搭建] - 操作简单,生态齐全,负载均衡器、存储等都配套齐全如果机器都是云服务器,则可以通过云平台(阿里云、腾讯云等)可视化搭建,只需要简单几步就可以快速搭建好一个集群;[裸机安装] - 配置麻烦,缺少生态支持,负载均衡器、云存储等都不支持需要至少两台机器(Master × 1

2022-06-17 15:55:14 283

原创 Kubernetes | 01.Kubenetes简介

视频:1.Kubernetes简介文档:Kubernetes(K8S)简介[传统部署方式] 应用直接在物理机上部署。​ 机器资源的分配不好控制,没有做到应用隔离,出现BUG时可能导致大部分资源被某个应用占用,或者某个应用影响了公用环境导致多个应用同时崩溃。[虚拟机部署] 在单个物理机上运行多个虚拟机,每个虚拟机中运行若干个应用。​ 每个虚拟机都是完整独立的系统,虚拟机内部的应用共用一套环境,做到了应用隔离。但虚拟机内部会独立运行一个bootfs(包含Linux内核),非常占用资源,若同时启动多台虚拟机,就会

2022-06-17 15:53:10 173

转载 软件工具 | 04.Typora搭配PicGo-Core实现用时间命名图片

在本文开始之前,已经安装好了Typora和PicGo-Core,并申请了阿里云OSS,完成了基本配置,可以正常上传图片到阿里云的OSS。[安装Node.js]下载地址:https://nodejs.org/zh-cn/,普通用户直接下载LTS长期支持版;安装msi文件,选择安装路径, 不要停;检测PATH环境变量是否配置了Node.js,点击开始 => 运行 => 输入”cmd” => 输入命令”path”,输出如下结果:我们可以看到环境变量中已经包含了 ;安装成功后,打开cmd命令行输入 ,出现类似如下

2022-06-16 20:12:21 473

空空如也

空空如也

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

TA关注的人

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