一   Java中的锁是什么?

/*
* 一 Java锁定义?
* 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。
* 锁旨在强制实施互斥排他、并发控制策略。
*
* 锁的宏观分类?
* 乐观锁 和 悲观锁。
*
* 二 乐观锁?
* 即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为
别人不会修改,所以不会上锁。 版本号机制 和 CAS算法 来实现乐观锁。
但是在更新的时候会判断一下在此期间别人有没有去更新这个数
据,采取在写时 先读出【当前版本号】,然后加锁操作(比较跟上一次的版本号,如果一样则更新),
如果失败则要重复读-比较-写的操作 案例 银行卡 理想型 事物之间不干扰。 事件一 进账
本人银行卡,到月发工资。 此时版本号1
余额 0 , 到账1000, 结束。 整个过程只有新增的一条记录
完成后 版本号 + 1 此时版本号2 事件二 消费
银行卡支付账单,查询余额,此时版本号2
有1000 元 ,扣除消费金额10元
余额 990元 此时版本号3 事件之间互相干扰
事件一和二,同时开始。
版本号都从1开始
让事件一完成,此时的版本号是2
事件二开始,事件二会对版本号进行比较,此时版本号不一致。事件二就会失败。
然后重复读---比较----写的操作。 cas算法? 比较替换。
是一种更新的原子性操作,比较当前的值,和传入的值是否一致性。 一样则更新,否则失败。 CAS利用CPU指令【调用的是本地方法】,从硬件层面保证了操作的原子性,
原语的执行必须是连续的。不存在线程切换的问题。以达到类似于锁的效果。 无锁操作,不可能出现死锁情况。 cas(v,e,n) 想把v 修改成n ,需要v和e 进行比较,二者相同,才跟新变量v,然后把v的值给赋值给新值n。
v 需要更新的变量
e 预期值
n 新值 我们提供一个期望值 e ,当他和v 就是需要更新的变量是相等的。说明还没有线程修改该值。可以执行cas操作。
反之,期望值和需要更新的变量不相等。说明已经被其他线程修改。就不执行更新操作。
可以重新读取该变量,尝试再次修改,也可以放弃操作。 cas bba问题?
对应一个版本号,一个数据一个版本,值相等,版本号相等,才能修改。 三 悲观锁 Synchronized
悲观锁(Pessimistic Lock), 做最坏的打算来处理问题,每次去拿数据的时候都认为别人会修改。
所以每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放。 四 区别?
悲观锁阻塞事务,乐观锁回滚重试,
它们各有千秋,取决于实际使用场景。 像乐观锁适用于写比较少的情况下,冲突很少发生的时候,这样可以省去锁的开销,加大了系统的整个吞吐量。
但如果经常产生冲突,上层应用会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。 *
*
*
*
*/

Java 锁 概念介绍的更多相关文章

  1. Java基础之(一)——从synchronized优化看Java锁概念

    一.悲观锁和乐观锁概念 悲观锁和乐观锁是一种广义的锁概念,Java中没有哪个Lock实现类就叫PessimisticLock或OptimisticLock,而是在数据并发情况下的两种不同处理策略. 针 ...

  2. Java锁概念基础

    Java中的锁不管是Lock还是synchronized都可以分为互斥锁和非互斥锁. 互斥锁只能被一个线程持有,其他线程只能等待锁的释放.synchronized,ReentrantLock,Read ...

  3. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  4. java中锁的概念/介绍

    前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6).使用场景进行举例,为读者介绍 ...

  5. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  6. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  7. Java基础加强之并发(一)基本概念介绍

    基本概念介绍 进程:它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节. 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负 ...

  8. java中的各种锁详细介绍

    转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高 ...

  9. Java SE/ME/EE的概念介绍

    转自 Java SE/ME/EE的概念介绍 多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用. ...

随机推荐

  1. 【LeetCode】611. Valid Triangle Number 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/valid-tri ...

  2. 【LeetCode】508. Most Frequent Subtree Sum 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. 抛砖系列之-MySQL中的数据类型JSON

    今天介绍一个MySQL中的数据类型-JSON,相信大家对JSON都不陌生,在日常工作中使用到的频率也很高,话不多说,直接开始. 何谓JSON 看下RFC文档对于JSON的描述 1.基于 JavaScr ...

  4. Log4j2基本使用入门

    1.Log4j2简介 Apache Log4j 2是日志框架Log4j的升级, 它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进, 同时修复了Logback的一 ...

  5. sqlsugar freesql hisql 三个ORM框架性能测试对比

    hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...

  6. Flask_安装和配置(一)

    安装Flask pip install flask 一 .创建Flask项目 Flask与Django相比,没有提供任何自动创建项目的操作,所以需要手动创建项目及启动项目的管理文件 例如,创建项目目录 ...

  7. 【PowerShell】文件的解压与压缩

    1 New-Item -ItemType File 1.txt -Force #新建文本文件 2 Compress-Archive -Path '1.txt' -DestinationPath '1. ...

  8. [转]Vue之引用第三方JS插件

    1.绝对路径引入,全局使用. 在index.html文件中使用script标签引入插件. 该种方式就是上面演示ckplayer插件使用的方式. 备注: 这种方式的引用,会在开启ESLint时,报错,可 ...

  9. js对象数组多字段排序

    来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...

  10. Lyft 宣布开源基础设施工具管理平台 Clutch!

    今天我们很高兴地宣布,Lyft 的基础设施工具可扩展 UI 和 API 平台clutch已开放源代码,clutch使工程团队能够构建.运行和维护用户友好的工作流,这些工作流还包含特定于域的安全机制和访 ...