转自: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之 乐观锁与悲观锁相关推荐

  1. java 多线程系列基础篇(二)

    概要 本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable. 之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池 ...

  2. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括: 1. 线程优先级的介绍 2. 线程优先级的示例 3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/s ...

  3. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式   2.1 终止处于"阻塞状态"的线 ...

  4. java多线程编程--基础篇

    一.基本概念 a.操作系统中进程与线程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间, 一个进程中可以启动 ...

  5. interupt java_Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解. Interrupts this thread. Unless the current th ...

  6. Java多线程系列之“JUC集合“详解

    Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...

  7. java多线程并发基础汇总一

    一.java并发线程基础 文章目录 一.java并发线程基础 1.1 什么是线程 1.2 线程的创建方式 1.3 Object类中的方法:线程通知与等待 1.4 Thread类中的方法 1.4.1 等 ...

  8. Java面试题基础篇(一)

    Java面试题基础篇(一) Java面试题基础篇(一) 1.jre和jdk有什么区别? 2.==与equals的区别? 3.接口和抽象类的共同点和不同点? 4.lamda表达式的优缺点? 5.Stri ...

  9. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...

  10. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

最新文章

  1. Spring Cloud源码分析(二)Ribbon(续)
  2. 读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout
  3. QT如何设置应用程序的图标
  4. MYSQL安装时解决要输入current root password的方法
  5. 机器学习 | EM 算法原理
  6. POJ 3037 SPFA
  7. python产生随机数
  8. idea的HttpClient工具,发送post/get请求,可以发送json
  9. C语言全局变量和局部变量
  10. JAVA鲜花订购网微服务计算机毕业设计Mybatis+系统+数据库+调试部署
  11. vue + element-ui本地下载图片
  12. 怎么看计算机电源型号,电脑电源铭牌怎么看?台式机电源铭牌知识扫盲 拒绝虚标!...
  13. openwrite Test
  14. 【应用】Markdown 在线阅读器
  15. VMware 日记一:基础的系统安装和基本配置解析
  16. 迷途中的融担:在下沉与专注中寻找未来
  17. php java集成_PHP和Java 集成开发详解分析 强强联合第1/4页
  18. 关于深圳市住房和建设局《关于建立二手住房成交参考价格发布机制的通知》涉嫌法律依据不足、越权行使银保监人行市监等部门职能、涉嫌限制《物权法》赋予公民合法权益、涉嫌违背国务院及国家发改委上位法规
  19. 微信小程序课程的学习心得
  20. 沙比尔•巴蒂亚访谈:Hotmail创业传奇

热门文章

  1. C# 改变图片大小的功能代码片段 (wince5)
  2. MonoRail - 生命周期及controller/action/view详解(转)
  3. css matrix矩阵,矩阵 | matrix() (Transforms) - CSS 中文开发手册 - Break易站
  4. lisp把多段线顶点连成表_读取多段线顶点并将顶点坐标标到数组中
  5. 【VScode】使用VScode来写markdown ② 流程图
  6. 分页插件pagehelper ,在sql server 中是怎么配置的
  7. 复习JS事件及DOM
  8. ES6 变量解构赋值
  9. java mybatis 动态sql
  10. 云计算之路:数据库服务器的选择——舍RDS取云服务器