Java 中的锁
Java 中的锁Lock 接口
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发访问共享资源,比如读写锁)。
Lock 接口提供了与 synchronized 关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。
Lock 接口拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种 synchronized 关键字所不具备的同步特性。
synchronized获取锁是一个原子操作,在线程获取锁的过程中是无法响应中断的。
队列同步器(AQS / AbstractQueuedSynchronizer)使用
AQS 用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作。
同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组件使用,同步器既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态。
方便实现 ReentrantLock、ReentrantReadWrite ...
Java并发编程基础
Java并发编程基础线程的状态
线程的状态变化
Daemon 线程
Daemon 线程是一种支持型线程(常被叫做守护线程),因为它主要被用作程序中后台调度以及支持性工作。
可以通过调用 Thread.setDaemon(true) 将线程设置为 Daemon 线程。
中断
许多声明抛出 InterruptedException 的方法(例如 Thread.sleep(long millis) 方法)在抛出 InterruptedException 之前,Java 虚拟机会先将该线程的中断标识位清除,然后抛出 InterruptedException。此时调用 isInterrupted() 方法将会返回 false。
安全地终止线程
使用标志位
使用中断
线程间通信
volatile 和 synchronized 关键字
等待/通知机制
难以确保及时性
难以降低开销
等待/通知的相关方法是任意 Java 对象都具备的,因为这些方法被定义在所有对象的超类 java.lang.Object 上。
不同线程之间通过锁对象的 wait 和 notify 方法进行消息 ...
Java内存模型
Java内存模型Java 内存模型的基础并发编程模型的两个关键问题
线程之间如何通信 / 线程之间如何同步
共享内存(Java采用):
线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。
同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。
消息传递:
线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。
消息的发送必须在消息的接收之前,因此同步是隐式进行的。
Java 内存模型的抽象结构(JMM)
JMM 定义了线程和主内存之间的抽象关系:
线程之间的共享变量存储在主内存(Main Memory)。
每个线程都有一个私有的本地内存(Local Memory):
本地内存中存储了该线程以读/写共享变量的副本。
本地内存是 JMM 的一个抽象概念,并不真实存在。
从源代码到指令序列的重排序
为了提高性能,编译器和处理器常常会对指令做重排序。
编译器优化的重排序(编译器重排序):
编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
指令级并行的重排序(处理器重排序):
现 ...
并发编程的挑战和底层原理
并发编程的挑战和底层原理并发编程的目的并发编程的目的是为了让程序运行得更快。
并发编程的挑战
上下文切换
死锁
资源限制
Java 并发机制的底层实现原理Java 中的并发机制依赖于 JVM 的实现和 CPU 的指令。
volatile 关键字
volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。
实现原理
对 volatile 变量进行写操作时,会多出第二行汇编代码:
将当前处理器缓存行的数据写回到系统内存。
这个写回内存的操作会使在其他 CPU 里缓存了该内存地址的数据无效。
volatile 的使用优化
将共享变量追加到 64 字节,保证每个缓存行中保留完整的一份数据,对于频繁修改的数据,可以有效提高多处理器的处理效率。
synchronized 关键字
锁对象
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的 Class 对象。
对于同步方法块,锁是 Synchronized 括号里配置的对象。
实现原理
JVM 基于进入和退出 Monitor 对象来实现方法同步和代码块同步:
任何对象都有 ...
消息队列-入门
基础概念消息队列是一个可以用于存放消息的容器
消息队列满足FIFO原则
参与消息传递的双方被称为生产者和消费者,生产者负责发送消息,消费者负责处理消息
消息队列是一种中间件
中间件是一种为应用软件服务的软件,不同的软件和技术架构可以借助中间件来实现信息与资源的共享
使用消息队列的优点:
异步处理提高系统性能(减少响应所需时间)
消峰/限流
降低系统耦合性
消峰/限流:
将短时间高并发的事务消息存储在消息队列中,之后后端服务再慢慢根据自己的能力去消费这些消息,可以避免直接把后端服务打垮掉
降低系统耦合性:
消息队列可以使用发布-订阅模式工作,生产者发布消息,一个或者多个消息接收者订阅消息。消息的生产者和消息的消费者之间没有直接的耦合。同时,如果希望新增消费者,只需要订阅该消息,对原有的系统和业务没有影响,提高系统的可拓展性。
实现分布式事务:
分布式事务的解决方案之一就是MQ事务。事务允许事件流应用将消费,处理,生产消息整个过程定义为一个原子操作
使用消息队列带来的问题:
导致系统可用性降低:消息队列可能挂掉
系统的复杂性提高:消息重复消费问题,处理 ...
操作系统-进程与线程
进程与线程进程与线程的概念
进程的概念:由 CPU 执行的运行中的程序,被称为进程 (Process)。
并行:两个任务同时进行。
并发:两个任务在一段时间中交替进行。
进程的状态
创建
就绪
就绪挂起
运行
阻塞
阻塞挂起
结束
进程的控制结构(PCB)
PCB 是进程存在的唯一标识:
进程描述信息:
进程标识符
用户标识符
进程控制和管理信息:
进程当前状态(new、ready、running、waiting、blocked)
进程优先级:进程抢占 CPU 时的优先级
资源分配清单:
包括内存地址空间和虚拟地址空间的信息,所打开的文件列表和所使用的 I/O 设备信息。
CPU 相关信息:
CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会保存在相应的 PCB 中。
进程的组织方式
链表:通过链表,把具有相同状态的 PCB 连接在一起,形成各种状态队列。
索引:把同一状态的进程组织在一个索引表中,索引表项指向对应的 PCB,不同状态对应不同的索引。
选择链表的原因
链表可以更灵活地进行插入和删除,适应进程的创建、销毁等调度需求。
...
操作系统-网络系统
网络系统网络性能指标
带宽:链路最大传输速率
延时:请求包发送后,收到对端响应所需要的时间延迟。不同场景含义不同,可以表示建立TCP连接所需要的时间延迟,或者一个数据包往返所需要的时间延迟。
吞吐量:单位时间成功传输的数据量
PPS:以网络包为单位的传输速度
其他指标
网络可用性
并发连接数
丢包率
重传率
查看网络配置的命令
ipconfig / ip
查看Socket信息
netstat / ss
查看网络吞吐量
sar
查看连通性和延时
ping
从日志分析PV、UV
ls -lh 查看文件大小
cat 查看文件,一次性加载
scp 传输文件到闲置的服务器
less 查看文件,部分加载
tail 查看文件最新内容
-n 指定行数
-f 实时刷新
wc -l 查看文件中行数
awk '{print substr($4, 2, 11) " " $1}' | sort | uniq | awk '{uv[$1]++; next}' END ...
操作系统-调度算法
调度算法调度算法进程调度
先来先服务
对长作业有利
短线程优先
对短作业有利
高响应比
权衡了长短作业
时间片轮转
最公平
最高优先级算法
从就绪队列中选取最高优先级的进程运行
多级反馈队列算法
时间片轮转和最高优先级的综合发展
内存置换
最佳页面置换算法
用于测试内存置换算法的性能
先进先出
置换在内存中留存时间最长的
最近最久未使用
置换最长时间没有被访问的
时钟页面置换算法
最不常用算法
磁盘调度算法
先来先服务
磁盘最短寻道优先
可能产生饥饿
扫描算法
循环扫描算法
LOOK
C-LOOK
操作系统-内存管理
内存管理虚拟内存
虚拟内存:操作系统为了将进程和物理内存隔离,设计的一种内存映射。
内存分段虚拟地址
段选择子:
段号(段表的索引)
特权标志位
段内偏移量(0 ~ 段界限)
段表:
段的基地址
段的界限
权限等级
物理地址:段的基地址 + 段内偏移量
内存分段机制
将程序的虚拟地址分为4个段,每个段在段表中有一项,在这一项中找到段的基地址,再加上偏移量,就能找到物理内存中的地址:
代码段
数据段
堆段
栈段
内存分段的问题
内存碎片:
外部内存碎片:产生多个不连续的小物理内存,导致新的程序无法被装载。
内部内存碎片:程序的所有内存都被装载到物理内存中,但部分内存不常使用,导致内存浪费。
解决方式:
内存交换:通过交换技术,减少碎片。
内存交换效率低:
每次内存交换都需要将内存写到硬盘上,再从硬盘上读回到内存,硬盘访问速度较慢,导致性能瓶颈。
解决方式:
内存分页:通过分页管理提高效率。
内存分页概念
将整个虚拟和物理内存空间切成固定大小的页(在Linux下,每一页的大小为4KB)。
虚拟内存和物理内存之间通过页表来映射。
内存管理单元 (MMU) ...
计算机网络-总结
网络分层模型
OSI七层模型
应用层:为计算机用户提供服务
表示层:数据处理(编解码、加密解密、压缩解压缩)
会话层:管理(建立、维护、重连)网络应用程序之间的会话
传输层:为两台主机进程之间的通信提供通用的数据传输服务
网络层:路由和寻址
数据链路层:帧编码和误差纠正控制
物理层:透明地传送比特流
TCP/IP四层模型
应用层:负责为用户提供具体的网络服务,如文件传输(FTP)、电子邮件(SMTP)、网页浏览(HTTP)等。HTTP、HTTPS、FTP、SMTP、DNS、Telnet、SSH等。
传输层:提供端到端的通信服务。确保数据的完整性、顺序性和可靠性(TCP)。提供无连接的、快速传输的数据服务(UDP)。TCP、UDP。
网络层: 负责数据包的寻址和路由选择,确保数据能够从源主机传输到目标主机。无连接通信,不保证数据的可靠性。IP(IPv4、IPv6)、ICMP、ARP、RARP。
网络接口层:负责主机与物理网络之间的交互。处理硬件设备的驱动和数据帧传输。包括链路控制(LLC)和介质访问控制(MAC)。Ethernet、PPP、Wi-Fi 等。
从输入UR ...