首页 > 其他分享 >985研一学习日记 - 2024.11.25

985研一学习日记 - 2024.11.25

时间:2024-11-26 12:32:27浏览次数:11  
标签:25 2024.11 队列 阻塞 985 写锁 读锁 线程 操作

一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。

日常

1、起床

2、健身

3、LeetCode刷了1题

  1. 单词拆分
    1. 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
    2. 该问题使用回溯遍历所有的子集会超时,故使用动态规划
    3. 定义dp数组并确定下标含义:**dp[i]表示前i个字符能否被拆分**
    4. 确定递推公式:dp[i]=遍历所有单词,判断后面部分是否等于单词且前面是否可以拆分,如果当后面部分与某个单词匹配,且减去后前面部分仍然可拆分,则说明当前可拆分,并求出最小拆分数目
    5. 初始化dp[0]=0,表示0个字符时不可拆分
    6. 确认遍历顺序:此时是完全背包,因为每个单词都可以放入多次,且求得是排列,因为单词的顺序是有要求的,否则组合字符串不同;故使用一维数组从前向后遍历(每个元素可以放入多次),且先遍历背包再遍历物品
    7. 求组合时,先遍历物品再遍历背包求排列时,先遍历背包再遍历物品
    8. 一定要判断是求组合还是排列

4、复盘

不复盘等于白学!!!


学习和感想

JUC并发编程

1. JUC读写锁

  1. 悲观锁和乐观锁
    1. 悲观锁就是操作时一定先进行上锁,等操作结束后再释放锁,就是假设自己操作时别人一定会更新,故操作前一定会加锁;可以避免各种并发问题,但不支持并发操作,效率很低
    2. 乐观锁就是操作时不进行上锁,当结束操作时先判断数据是否被更改,如果没有更改则更新,否则操作失败;乐观锁支持并发,但有时会操作失败
    3. 乐观锁操作前不会加锁,但最后会判断数据是否更新,如果更新了则操作失败,即为每个数据添加一个版本号,操作后判断版本号是否未变,如果没变则操作成功,否则更新失败
  2. 表锁和行锁
    1. 就是对数据库中的一张表进行加锁,当操作数据库中表的数据时,对整张表进行加锁,此时别的就无法访问该表
    2. 而行锁时只对数据库某张表的某行数据进行加锁
    3. 表锁不会发生死锁,但行锁会发生死锁,因为两个相互依赖的数据行可能会被同时加锁,此时就会出现因为竞争资源而造成的相互等待现象
  3. 读锁和写锁
    1. 读锁是共享锁可以由多个线程同时进行读操作
    2. 写锁是独占锁,每次只允许一个线程执行写操作
    3. 读锁是共享锁,写锁是独占锁;且读写锁都会发生死锁
    4. 读锁和写锁都会发生死锁,且写锁可以降级为读锁,因为写锁时可以申请读锁,而读锁时不可以申请写锁,故写锁可以降级为读锁,但读锁不可以升级为写锁
  4. 案例实现:JUC类中的ReentryentReadWriteLock实现类
    1. JUC类中的ReentryentReadWriteLock实现类可以返回读锁和写锁对象,读锁是共享锁,写锁是独占锁,且均会出现死锁,且会出现锁饥饿
    2. JUC工具包中提供了读写锁ReadWriteLock接口,通过该接口的实现类ReentrantReadWriteLock对象可以实现读写锁的操作
    3. ReadWriteLock维护了一对读写锁,一个用于只读操作,一个用于写入操作,通过readLock()返回读锁writeLock()返回写锁,并通过lock()和unlock()来加锁和解锁
    4. 只要没有写,读锁可以被多个线程同时保持,此时别的读线程仍然可以加入读取,此时写入操作会一直等待
    5. 写入锁是独占的,只要有写入锁,别的写入和读取就无法
    6. 读锁是共享锁,可以多个线程同时占用写锁是独占锁,一次只可以有一个线程占用
  5. 读写锁深入
    1. 读锁是共享锁,写锁是独占锁,不可以同时存在读写问题
    2. 就是读者写者问题,此时写锁可能会饥饿,故可以再设置一个信号量,当写锁获得信号量后,读锁就无法再加入进入,从而防止写饥饿
    3. 为什么要引入读写锁,因为如果使用独占锁,则写问题可以满足,但对于读问题无法实现并发读,效率很低独占锁无法实现并发读
    4. 读写锁既可以保证写时独占也可以保证读时并发共享,从而提高效率读写锁可以保证写时独占,读时共享,可以保证写时独占,读时共享,从而提高效率
    5. 读写锁可能会出现饥饿问题,因为当读锁一直被占用时,就无法进行写操作
    6. 读写锁读时不可以进行写操作写时可以进行读操作
  6. 锁降级
    1. 读写锁读的时候不可以写写的时候可以读
    2. 锁降级就是将写入锁降级为读取锁
    3. 先获取写锁,再获取读锁(此时读锁未被占用),最后释放写锁
    4. 读时不可以写,写时可以读读写锁当获得了读锁后,此时就无法再获取写锁,而获得了写锁后还可以再获得读锁
    5. 获得了写锁后可以再获得读锁,但获得读锁后无法再获得写锁

2. BlockingQueue阻塞队列

  1. 概述
    1. BlockingQueue阻塞队列是线程共享的一个队列,可以读取和存放数据,且会自动实现阻塞和唤醒,当队列为空时,此时读取就会阻塞,当队列满时,此时存放就会阻塞
    2. 队列是先进先出FIFO栈是先进后出FILO
    3. 阻塞队列是一个共享的队列,多个线程对该队列进行操作
    4. 多个线程共享一个阻塞队列,线程对该阻塞队列进行存取操作
    5. 当队列为空时,此时取数据的线程就会被阻塞当队列为满时,此时存数据的线程就会被阻塞
    6. 直到可以存取时阻塞的线程就会被唤醒
    7. 当使用阻塞队列后,此时会自动对线程进行阻塞唤醒操作,而不需要手动阻塞和唤醒
  2. 架构
    1. BlockingQueue是JUC工具包提供的一个接口类,内部有很多实现类来实现具体的阻塞队列,JUC中提供了很多类型的BlockingQueue,包括数组实现的队列和链表实现的队列等
    2. 多个线程共享一个阻塞队列,会自动对线程进行阻塞和唤醒操作,当队列为空时,此时取操作就会阻塞,但队列满时,此时存操作就会阻塞,且当可以存取时会自动唤醒
  3. 分类
    1. ArrayBlockingQueue:基于数组实现的阻塞队列,内部维护一个定长的数组
    2. LinkedBlockingQueue:基于链表实现的阻塞队列:内部的队列由链表实现,可以指定最大容量,默认值为最大值
    3. DelayQueue:使用优先级队列实现的延迟无界阻塞队列,只有当指定的时间到了才可以获取该元素
  4. 核心方法
    ![[attachments/Pasted image 20241125130550.png]]

标签:25,2024.11,队列,阻塞,985,写锁,读锁,线程,操作
From: https://blog.csdn.net/LiuYQi/article/details/144043112

相关文章

  • 11.25 周一日常
    11.25周一日常Q1.1200给定x,y,k,k次操作,每次操作:x++,若x可被y整除,x一直除以y。问最终x的值。(x,y,k≤1e9)Q2.1400给定一等差数列a,每次操作:令最大值=mex{a}。问是否可以将a变成0~n-1的排列和最小操作次数。(1e18)Q3.1600给定一数组和lim,设操作l,r:i:l->r,令s=0,s+=a[i];每一步如......
  • 11.25 NOIP 模拟赛题解
    T1P1069[NOIP2009普及组]细胞分裂原题链接这道题就是基本的数学知识。我们直接来转化题意,这道题就是让我们求min⁡(k......
  • 【2024-11-25】生活主旋律
    20:00只要你有活泼的心灵,你有一个善感的充满了对宇宙万物赏爱和关心的心灵,处处就都是生活的情趣,处处都是你生活的理想。                                                ......
  • Burp Suite Professional 2024.11 发布下载,新增功能简介
    BurpSuiteProfessional2024.11发布下载,新增功能简介BurpSuiteProfessional2024.11(macOS,Linux,Windows)-Web应用安全、测试和扫描2024年11月25日,版本2024.11请访问原文链接:https://sysin.org/blog/burp-suite-pro/查看最新版。原创作品,转载请保留出处。......
  • 2024年11月25日总结
    今天完成了前端对数据库一张表的增删部分,改查还有一些缺陷。还重新温习了一下哈夫曼树importjava.util.*;classHuffmanNodeimplementsComparable{charcharacter;intfrequency;HuffmanNodeleft,right;publicHuffmanNode(charcharacter,intfrequency){this......
  • python复习笔记——2024.11.25
    2024.11.25一、类的定义二、类与实例的关系#定义一个猫类,age,name,color是属性,或者称为成员变量classCat: age=Nonename=Nonecolor=Nonecat1=Cat()#通过对象名.属性名,可以给各个属性赋值cat1.name="小白"cat2,age=2cat3.color="白色"print(f......
  • Java学习笔记——2024.11.25
    2024.11.25一、Java_DOS原理1.DOS基本原理创建文件夹=>mdd:\\xxx消除文件夹=>rdd:\\xxx2.相对路径和绝对路径=>相对路径:从当前目录开始定位,形成的一个路径=>绝对路径:从顶级目录d,开始定位,形成的路径举例子:相对路径:..\..\abc2\test200\hello.txt......
  • 11.25
    做差旅费报销管理信息系统页面要求(1)系统可以通过浏览器直接访问;(1分)(2)各个功能页面整体风格统一;(3)首页为用户登录页面,职员、职员经理、总经理、财务人员四种角色用户登录后,进入相应的功能页,只能看到角色允许访问功能模块,用户登录界面包含用户、密码两个文本框,以及登录按钮;(4分)(4)职......
  • 2025年计算机毕业设计选题大全:微信小程序选题篇(新颖必过)
    一、前言......
  • 每日打卡11.25
    includeincludeusingnamespacestd;structTime{inthours;intminutes;intseconds;};TimeaddSeconds(Timet,intsecondsToAdd){t.seconds+=secondsToAdd;//Convertsecondsoverflowtominutest.minutes+=t.seconds/60;t.seconds%=60;//Co......