第二天 测试八股背诵_第二天 测试八股背诵有用吗
乐观锁悲观锁的区别
(1)乐观锁假设大部分情况下不会冲突,所以一开始不加锁;悲观锁就是假设一定会冲突,所以在操作数据库之前直接上锁
(2)应用场景不同:读多写少用乐观锁,读少写多用悲观锁;
乐观锁适用于冲突概率较低的场景,悲观锁适用于冲突较高的场景:例如强一致性的业务(银行相关)
(3)乐观锁冲突需要重试;悲观锁保证强一致性,无需重试,缺点就是加锁的成本高,容易引发死锁
(4)性能:乐观锁在高并发读场景下性能更高,悲观锁在高并发写场景下性能较低。
死锁是什么
死锁是指两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁是指两个或两个以上的进程或线程在执行过程中,去争夺同一个共享资源,导致互相等待的现象
产生死锁的条件
1)互斥条件:一个资源一次只能被一个进程使用;一个线程拿到锁之后,另一个线程再尝试获取锁,必须要阻塞等待.
(2)不可剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺,必须阻塞等待;线程1拿到锁,线程2也尝试获取这个锁,线程2必须阻塞等待
(3)请求和保持:一个进程因请求资源而阻塞时,对已获得资源保持不放
一个线程拿到锁1之后,不释放锁1的前提下,获取锁2
如果先放下左手的筷子,再拿右手的筷子,就不会构成死锁
(4)循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系
多个线程,多把锁之间的等待过程,构成了"循环" A等待B,B也等待A或者A等待B,B等待C,C等待A
线程和进程有什么区别
(1)根本区别:进程是操作系统资源分配的基本单位.,线程是操作系统调度执行的基本单位;进程包含线程
(2)存储空间:进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间
(3)进程创建和销毁开销大,需分配独立资源;线程创建和销毁开销小,共享进程资源;同一个进程中的多个线程之间,共用同一份资源(内存,文件)
进程的切换代价比较大,需要保存上下文和状态,而线程的切换代价比较小,因为它们共享进程的资源。
(4)进程是指正在运行的一个程序的实例。每个进程都拥有的资源:堆、栈、虚存空间(页表)、文件描述符等信息。在Java中,每个进程都由一个主线程启动。当进程运行时,操作系统会为其分配一个进程号,并将其作为一个独立的实体来进行管理。
线程是指进程中的一个执行单元,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。在Java中,每个线程都拥有自己的栈空间和程序计数器,并且可以访问共享的堆内存。
(6)独立性:进程:一个进程崩溃通常不会影响其他进程(资源隔离)
线程:一个线程崩溃可能导致整个进程崩溃(共享同一地址空间)。线程间缺乏保护机制,容易因编程错误(如野指针)相互影响。
一个进程挂了一般不会影响到其他进程.但是一个线程挂了,可能把同进程内的其他线程一起带走(整个进程崩溃).
(7)进程之间的通信比较复杂,而线程之间可以直接共享数据
热修复场景+如何测试
热修复修复的场景:
图片的icon资源 文案 UI间距类的排版 大小 部分的crash anr
如何测试:
(1)确认补丁包会修复哪些问题(2)通过冷启或热启验证补丁包是否拉取成功(3)验证结果
线程安全和线程不安全
(1)线程安全可以在多线程环境下,通过同步机制确保数据的一致性和可预测性
(2)线程不安全在多线程环境下,对共享资源或者临界资源的数据不一致性和不可预测性