Java多线程系列---“基础篇”13之 乐观锁与悲观锁
转自:http://www.cnblogs.com/zhengbin/p/5657435.html
乐观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
CAS便是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
比如说synchronized就是一种独占锁,他假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
缺点:
由于在进程挂起和恢复执行过程中存在着很大的开销。当一个线程正在等待锁时,它不能做任何事。举个栗子,如果一个线程需要某个资源,但是这个资源的占用时间很短,当线程第一次抢占这个资源时,可能这个资源被占用,如果此时挂起这个线程,可能立刻就发现资源可用,然后又需要花费很长的时间重新抢占锁,时间代价就会非常的高。
转载于:https://www.cnblogs.com/Hermioner/p/9894334.html
Java多线程系列---“基础篇”13之 乐观锁与悲观锁相关推荐
- java 多线程系列基础篇(二)
概要 本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable. 之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池 ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括: 1. 线程优先级的介绍 2. 线程优先级的示例 3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/s ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式 2.1 终止处于"阻塞状态"的线 ...
- java多线程编程--基础篇
一.基本概念 a.操作系统中进程与线程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间, 一个进程中可以启动 ...
- interupt java_Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解. Interrupts this thread. Unless the current th ...
- Java多线程系列之“JUC集合“详解
Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...
- java多线程并发基础汇总一
一.java并发线程基础 文章目录 一.java并发线程基础 1.1 什么是线程 1.2 线程的创建方式 1.3 Object类中的方法:线程通知与等待 1.4 Thread类中的方法 1.4.1 等 ...
- Java面试题基础篇(一)
Java面试题基础篇(一) Java面试题基础篇(一) 1.jre和jdk有什么区别? 2.==与equals的区别? 3.接口和抽象类的共同点和不同点? 4.lamda表达式的优缺点? 5.Stri ...
- Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类
概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
转载自 Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...
最新文章
- Spring Cloud源码分析(二)Ribbon(续)
- 读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout
- QT如何设置应用程序的图标
- MYSQL安装时解决要输入current root password的方法
- 机器学习 | EM 算法原理
- POJ 3037 SPFA
- python产生随机数
- idea的HttpClient工具,发送post/get请求,可以发送json
- C语言全局变量和局部变量
- JAVA鲜花订购网微服务计算机毕业设计Mybatis+系统+数据库+调试部署
- vue + element-ui本地下载图片
- 怎么看计算机电源型号,电脑电源铭牌怎么看?台式机电源铭牌知识扫盲 拒绝虚标!...
- openwrite Test
- 【应用】Markdown 在线阅读器
- VMware 日记一:基础的系统安装和基本配置解析
- 迷途中的融担:在下沉与专注中寻找未来
- php java集成_PHP和Java 集成开发详解分析 强强联合第1/4页
- 关于深圳市住房和建设局《关于建立二手住房成交参考价格发布机制的通知》涉嫌法律依据不足、越权行使银保监人行市监等部门职能、涉嫌限制《物权法》赋予公民合法权益、涉嫌违背国务院及国家发改委上位法规
- 微信小程序课程的学习心得
- 沙比尔•巴蒂亚访谈:Hotmail创业传奇
热门文章
- C# 改变图片大小的功能代码片段 (wince5)
- MonoRail - 生命周期及controller/action/view详解(转)
- css matrix矩阵,矩阵 | matrix() (Transforms) - CSS 中文开发手册 - Break易站
- lisp把多段线顶点连成表_读取多段线顶点并将顶点坐标标到数组中
- 【VScode】使用VScode来写markdown ② 流程图
- 分页插件pagehelper ,在sql server 中是怎么配置的
- 复习JS事件及DOM
- ES6 变量解构赋值
- java mybatis 动态sql
- 云计算之路:数据库服务器的选择——舍RDS取云服务器