怎么给网站搭建后台,阿里首个网站开发人员,合肥网络推广培训学校,公司建网站价格锁策略
在要实现一把锁的时候需要锁策略。
悲观锁vs乐观锁
在使用锁时#xff0c;预测锁发生冲突的概率。
预测概率越高就是“悲观锁”。
预测概率越低就是“乐观锁”。
对于悲观锁来说通常会进行一些阻塞操作。
对于乐观锁来说锁冲突的概率不大#xff0c;通常会进行…锁策略
在要实现一把锁的时候需要锁策略。
悲观锁vs乐观锁
在使用锁时预测锁发生冲突的概率。
预测概率越高就是“悲观锁”。
预测概率越低就是“乐观锁”。
对于悲观锁来说通常会进行一些阻塞操作。
对于乐观锁来说锁冲突的概率不大通常会进行忙等/版本号。
重量级锁vs轻量级锁
重量级锁指加锁的开销比较大等待锁的线程等待时间会比较长。
轻量级锁指加锁的开销比较小等待锁的线程等待时间会比较短。
挂起等待锁vs自旋锁
挂起等待锁就是“悲观锁”和“重量级锁”的典型实现
当遇到锁冲突时就会让线程挂起等待将线程调度出CPU等待被CPU唤起去干别的事等空闲时再重新调度。
自旋锁就是“乐观锁”和“轻量级锁”的典型实现
当遇到锁冲突时不会放弃CPU就会通过忙等的方式再次尝试获取锁。
公平锁和非公平锁
以先来后到的方式判断公平。
读写锁
普通的锁只有加锁和解锁但是读写锁有加读锁加写锁解锁。
允许多次读锁但是不允许写锁和读锁写锁和写锁会有线程安全问题。
synchronized的优化体现
1.锁升级
synchornized是“自适应”锁在空闲时为自旋状态忙时就是挂起等待状态也是非公平锁而自适应就是锁升级。
偏向锁就是一开始对锁对象进行一个标记如果没有其他线程来竞争就直接保持到结束但是有其他线程竞争就加锁。
synchronized的原理就是无锁-偏向锁-自旋锁-重量级锁。
一开始是无锁然后进行一个标记锁当有其他线程竞争时就变成自旋锁当竞争进一步加强就变成重量级锁。
2.锁消除
当在不必要加锁的时候会自动去除锁。
3.锁粗化
在一段时间频繁的对同一段代码加锁解锁可能会被优化成一次加锁解锁。
CAScompare and swap
CAS对比与交换是先进行一个比较如果满足条件就交换同时返回true如果不满足就返回false。
CAS的伪代码 上述代码是通过一条cpu指令完成的意味着上诉代码是“原子”的。
CPU的特殊指令完成了上述操作操作系统又进行封装成APIJava又将封装了操作系统的API。
CAS的典型应用
1.实现原子类
想这样的操作不是原子的而是通过一条一条CPU指令完成的。
而AtonicInteger的就是原子的相似的还有更多Atonic的方法。
2.实现自旋锁
CAS的ABA问题
通过CAS来判定是指当前load到寄存器的值和内存中的值是否相同如果一致就判断没有其他线程修改接下来的操作线程安全。
但是当内存中的值A被改成B但是却被其他线程改成A了此时就会出现问题了这就是ABA问题。
但是一般情况下因为会将之给改回来所以不会有严重的bug但是也有特殊情况。
JUCjava.util.concurrent中的常见类
1.collable接口
collable类似于runnableRunnable中的是通过run方法执行任务且返回值是void而collable是call方法且返回值可以自定义。 2.ReentrantLock类
ReentrantLock是一把比较传统的锁在synchronized不成熟的时候所用的加锁方式。
要lock和unlock。
synchronized和ReentrantLock的区别
1.前者不需要自动解锁后者需要调用unlock。
2.前者在申请锁失败时会死等而后者可以通过trylock进行等待或直接放弃如果超过等待时间就会放弃加锁。
3.synchronized是非公平锁ReentrantLock默认是非公平锁可以添加true转变成公平锁。
4.synchronized通过wait/notify进行随机唤醒而ReentrantLock可以通过Condition进行更精准的唤醒。