每日小记
胡小胖HYY
一名程序媛
展开
-
7-30小记
第十四讲:Semaphore(信号量) 含义 类似生活中红绿灯,红灯停,绿灯行;线程能不能执行,需要看信号量是否允许; 信号量模型 1)一个计数器,一个等待队列,三个方法; 2)在模型中,计数器与等待队列是透明的,可以通过init()、up()、down()方法访问; 3)init():设置计数器初始值; up():计数器值+1, ...原创 2020-07-30 08:47:36 · 125 阅读 · 0 评论 -
7-15小记
第十二讲:Lock&Condition 引出问题 并发编程领域,两大核心问题,一个是互斥,同一时刻只允许一个线程访问共享资源, 另一个是同步,即线程之间如何通信,协作; Java SDK并发包通过Lock和Condition两个接口实现管程,其中Lock用于解决互斥问 题,Condition用于解决同步问题; 优势一:对于死锁问题,提出破坏不可抢占条件方案 1)能够响应中断:阻塞的线程响应中断信号,释放持有锁; 2)支持超...原创 2020-07-15 23:46:54 · 134 阅读 · 0 评论 -
7-10小记
第十一讲:为什么局部变量是线程安全的? 方法是如何被执行的 1)第一行,声明一个int变量a;第二行,调用方法fibonacci(a);第三行,将b赋值给c; 2)当调用fibonacci(a)时,CPU要先找到方法地址(0277),然后跳转到地址去执行 代码,最后执行完方法后,要能够返回(0132); 方法与调用栈 1)假如有A、B、C三个方法,调用关系是A->B->...原创 2020-07-10 21:18:46 · 133 阅读 · 0 评论 -
7-9小记
第十讲:创建多少线程才是合适的? 引出问题 在Java领域,实现并发程序的主要手段是多线程,使用多线程是简单的,但是使用多少个线程却是个难题? 为什么要使用多线程 本质就是提升程序性能,这个是比较笼统的概念,如何度量性能?核心标准:延迟、吞吐量; 延迟:发出请求到收到响应这个过程的时间(时间维度); 吞吐量:单位时间内能处理请求的数量(空间维度); 同等条件下,延迟越短,吞吐量越大;所谓提升性能,就是降低延迟,提高吞吐...原创 2020-07-09 22:28:05 · 140 阅读 · 0 评论 -
7-8小记
第九讲-java线程的生命周期 通用线程生命周期 1)初始状态: 编程语言层面,线程已经被创建;操作系统层面,线程还没有创建;不允许分配CPU执行; 2)可运行状态: 操作系统层面,线程已经被创建;允许分配CPU执行; 3)运行状态: 可运行状态(被分配空闲CPU) -> 运行状态; 4)休...原创 2020-07-08 22:37:17 · 117 阅读 · 0 评论 -
7-7_1小记
第八讲-管程,并发编程万能钥匙 背景 Java语言1.5之前,提供的唯一的并发原语就是管程; 定义 管程之管 - 管理共享变量; 管程之程 - 共享变量操作过程; 管程之结果 - 管理类的成员变量和成员方法,让这个类是线程安全的; 发展史 管程模型-Hasen模型、Hoare模型、MESA模型; 管程解决互斥问题 1) 思路 - 将共享变量以及对共享变量的操作统一封装起来; ...原创 2020-07-07 22:35:23 · 238 阅读 · 0 评论 -
7-7小记
第七讲 - 安全性、活跃性、性能问题 安全性问题: 何为线程安全: 从本质上,就是正确性,程序按照我们期望的执行,不出现诡异的bug; 从理论上,线程安全的程序,就是要避免原子性、可见性、有序性问题; 数据竞争:多个线程同时访问同一数据,并且至少有一个线程会写这个数据的时候,如不采取措施,则会导致并发bug; 竞态条件:程序的执行结果依赖于线程执行的顺序; 解决数据竞争和竞态...原创 2020-07-07 09:45:01 · 97 阅读 · 0 评论 -
7-2小记
第六讲 - 用"等待-通知"机制优化循环等待 引出问题: 上一篇中,破坏死锁条件之一:占用且等待条件,采用的方式是一次性申请所有资源,并且死循环等待资源; 代码如下: ...原创 2020-07-02 22:50:22 · 133 阅读 · 0 评论 -
7-1小记
第五讲-死锁 引出问题: 上一篇文章中,使用Account.class保护有关联关系的多个资源,但是与此同时,却带来性能问题,所有转账操作, A转给B,C转给D,都只能串行执行; 因此,尝试使用细粒度锁来优化性能,如下图代码中所示,一次转账操作中,只锁定转出账户和转入账户,这样A 转给B,C转给D,则可以并行执行; 但是有利必有弊,提高并行度同时,细粒度锁会出现一种情况,比如:线程T1执行A转给B,线程T2执行B转给A, ...原创 2020-07-01 21:58:12 · 142 阅读 · 0 评论 -
6-29小记
第四讲-互斥锁(下),如何保护多个资源 引出问题: 保护多个资源,分为两类:有关联关系的多个资源,没有关联关系的多个资源; 保护没有关联关系的多个资源: 背景: 账户类Account有两个成员变量:账户余额balance、账户密码pwd; 对账户余额的操作有:取款withdraw()、查看余额getBalance(); 对账户密码的操作有:修改密码modifyPwd()、查看密...原创 2020-06-29 22:31:03 · 120 阅读 · 0 评论 -
6-27小记
第三讲-解决原子性问题(上) 引出问题: 导致原子性原因是线程切换,禁止线程切换,这个问题不就解决了吗? 单核CPU,禁止线程切换,可以保证线程对共享变量的修改是互斥的; 多核CPU,禁止线程切换,无法保证线程对共享变量的修改是互斥的; 合理方案: 同一时刻只有一个线程执行,称为互斥;如果能保证对共享变量的修改是互斥的,无论是单核CPU,还是多核CPU, 都能保证原子性; 锁模型: j...原创 2020-06-27 20:46:57 · 110 阅读 · 0 评论 -
6-25小记
第二讲-解决可见性、有序性问题 引出问题: 导致可见性原因是缓存,导致有序性原因是编译优化,那我们可能想到,禁用缓存和编译优化,这两个问题不就解决了吗? 可是缓存和编译优化的提出是为了提高性能,如果禁用,程序的性能就堪忧了; 合理方案: 按需禁用缓存以及编译优化;然而,java内存模型规范了jvm如何提供按需禁用缓存和编译优化的方法,具体来说,就是三 个关键字(volatile、synchronize、final),六项Hap...原创 2020-06-25 23:48:02 · 107 阅读 · 0 评论 -
6-23小记
CTRL + U :从光标处删到开头 CTRL + R :搜索历史输入命令 spring 在扫描bean的时候会扫描方法上是否包含@Async注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用时增加异步作用。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个 bean 也就是 this. m.原创 2020-06-23 23:22:38 · 83 阅读 · 0 评论 -
6-24小记
第一讲 - 并发编程bug源头 可见性问题: 多颗CPU,多个线程操作一个共享变量,因为每颗CPU都拥有缓存缘故,其操作过程可能是相互独立且不可见的; 原子性问题: 高级语言中的一条语句并不等价于CPU的一条命令,并不是所谓的原子操作,而CPU能保证的原子操作是CPU指令级别; 举个栗子: count += 1 ;在高级语言中,它就是一条语句,但是它却对应CPU中三条指令(将count=0加载到寄存器,count+1=1, cou...原创 2020-06-24 09:08:14 · 176 阅读 · 1 评论