高并发

操作系统在运行一段程序的时候会创建一个进程

线程是进程的最小单位,调度的最小单元叫线程 

 

 

 

无锁并发:对数据取模。不同的线程处理不同的数据

cas:不用加锁   协程:在单线程里实现多任务的调度,在单线程里维持多任务的切换

 

 在写代码的时候,程序执行速度受限于计算机硬件资源或软件资源

 
什么是资源限制

 硬件:带宽、硬盘读写速度 cpu处理速度    (集群)

软件:数据库连接数、socket     (资源池)

资源限制引发的问题

某段串行执行的代码受限于资源,即使做了并发的处理,也会串行执行  增加上下文切换和资源调度的时间

如何解决
在资源限制情况下进⾏并发编程?

根据不同的资源的限制调整程序的并发度  

 

 

 

 

 

 

 sleep让线程进入阻塞状态,但不会释放锁,sleep一段时间后线程重新进入运行状态

wait方法释放锁,所以wait方法必须写在synchronize块里面,直到运行notify方法或wait的时间过期才会重新进入锁池

join方法调用线程等待该线程完成后,才能继续往下运行 也会释放锁

yield方法 不释放锁,将cpu的调度权礼让给优先级更高或  同等优先级的ruannble线程,(概率更大)

 

wait和notify方法的使用
1.wait 和 notify 均为 Object 的方法

Object.wait() —— 暂停一个线程
Object.notify() —— 唤醒一个线程
2.使用这两个方法时,我们需要先有一个Object对象,配合synchronize使用
3.wait被执行后,锁自动被释放
notify被执行后,锁不会自动释放,必须执行完notify)方法所在的synchronized代码块后才释放

 

 

 

 

 

 

 

 

 

 

 

 

 

 同步器  简化了锁(同步组件)的实现方式   屏蔽了同步状态的管理   、线程的排队等待泛型等

锁:定义了使用者和锁的交互接口

 

 

 

 线程安全的获取同步状态,这是aqs的模板方法

 

 

 

 

 

 

 查询同步队列中的等待情况   独占式的同步状态   共享式的同步状态

 

 canceled同步队列中的线程超时或中断了,那么同步队列中的线程就会被取消  singal中间状态   propegate 共享式

 

acquire方法 中构造同步队列的方法

 

 

 

 

 

  

 

 

 

 

 

 

 

 为了保证aqs先进先出的原则

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

reentrantlock

fe非公平没有先进先出的概念,只要获取到同步状态就可以拿到锁

 

 

 

 

 

 

按位切割  多个读操作和一个写操作的同步状态

 

 

 

 的大V 读写锁的目的在于写锁对读锁可见,如果读锁在已经被获取的情况下允许写锁的话,当前正在运行的读线程无法感知到写线程的操作了

 

 

 

 

posted @ 2021-07-27 23:48  悬崖听风098  阅读(48)  评论(0编辑  收藏  举报