一、锁
1、可见性:
定义:数据对所有线程可见
原因:cpu操作数据时会把数据读取到内存中去,可以理解为值做了备份,但是备份数据和原始数据在后续操作中不一定一致
实现:java使用volite关键字来实现,是最早的缓存一致性解决方案
原理:借助与cpu缓存一致的解决性方案,操作系统抽象其为lock操作
2、原子性:
定义:操作拆分为多个步骤后,在执行过程中中间变量被其它修改,导致操作和预期的不一致
3、隔离区(临界区)
定义:要实现多个线程对变量操作的安全性,就要实现操作的串行化
实现:java使用synchronized来实现
原理:对象在内存的头部有一个标识
悲观锁:其他线程操作时,加锁,悲观的认为锁不会马上释放,阻塞等待唤醒【算了。停在这等吧】
阻塞态到运行态会很耗时钟,如果预期不会马上唤醒,可以使用悲观锁
乐观锁:其他线程操作时,加锁,乐观的认为锁会马上释放,一直在轮询标志,查看锁释放状态【一直在问锁释放了没?】
一直运行于运行态,短时唤醒可以考虑,预期锁释放时间较长会更耗时钟
相关文章
- 异常java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getDefaultScriptingLanguageIn
- 基于java实现的分词以及词频统计,准备制作词云数据
- Java GUI Button组件上的内容中文乱码问题
- 使用java导出PPT的方法_简单的例子
- (已解决)idea下的maven的pom变成橘色,所有的java文件变成左下角的带J的文件,代码提示消失,用啥都不行了?
- 【极光推送】java后台使用第三方服务极光推送向安卓手机端推送通知(一)
- java: 程序包beans.factory.annotation不存在 Error:(16, 40) java: 找不到符号 符号: 类 WebMvcConfigurationSupport
- Idea .1版bug!Error:(3, 40) java: 程序包com.xxxx不存在
- springboot之引入父项目版本号报错,显示Error:(3, 32) java: 程序包org.springframework.boot不存在
- SSD Cloud Hosting - Linode的配置和部署,搭建Java环境