高并发
操作系统在运行一段程序的时候会创建一个进程
线程是进程的最小单位,调度的最小单元叫线程
无锁并发:对数据取模。不同的线程处理不同的数据
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 读写锁的目的在于写锁对读锁可见,如果读锁在已经被获取的情况下允许写锁的话,当前正在运行的读线程无法感知到写线程的操作了