Java 锁


 Java 中的锁是在多线程环境下,保证共享资源健康,线程安全的一种手段

 线程操作某个共享资源之前,先对资源加一层锁,保证操作期间没有其他线程访问资源,操作完成后再释放锁

保持数据一致性的方法

  • 事务管理:使用数据库事务来确保一组数据库操作要么全部成功提交,要么失败全部回滚

  • 锁机制:使用锁来实现共享资源的并发访问

  • 版本控制:通过乐观锁的方式,在更新数据时记录数据的版本信息,从而避免同时对同一数据进行修改

悲观锁

 顾名思义,它总是假设最坏的情况,认为所有资源都是不安全的,随时会被其他线程操作、更改,所以操作资源之前,必须加一把锁,防止其他线程访问(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程

Java 中悲观锁有哪些

  • synchronized关键字

    Java 中的关键字,底层由JVM虚拟机实现的同步机制

    使用方式:

    • 修饰静态方法:锁住的是类,该类下创建的所有对象都被锁住

    • 修饰实例方法:所住的是当前对象,当前对象所属类的其他对象不受影响

    • 修饰代码块:根据代码块所在区域的不同,实现不同效果,静态代码块锁住的是类,实例代码块锁住的是对象

  • AQS 框架

    AQS 是基于Java实现的一种抽象队列同步器框架

乐观锁

 它和悲观锁完全相反,它认为所有资源都是安全的,每个线程对资源的操作都符合预期,所以不需要对资源进行加锁,相比于悲观锁,乐观锁的性能要更好,因为它操作资源时,会采用一种确认机制(CAS机制)来确保所操作资源未被其他线程更改过

 实现方式:

  • CAS 操作:CAS 是乐观锁的基础,Java提供了java.util.concurrent.atomic包,包含各种原子变量类,这些类使用CAS操作实现了线程安全的原子操作

  • 版本号控制:增加一个版本号字段记录数据更新时的版本,每次更新时递增版本号,在更新数据时,同时对比版本号,如果与更新前版本号相同,则成功

  • 时间戳:使用时间戳记录更新时间,更新数据时对比时间戳,相同则成功,若大于之前的时间戳,则更新失败

Java并发 —— 线程并发(二)的更多相关文章

  1. java架构《并发线程基础二》

    1.关键字 volatile            使用场景: 针对与多线程公用的数据  用volatile关键字修饰  但其不保证原子性(同步).volatile关键字不具备synchronized ...

  2. Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

    同样是从网上看到的一个需求,需求描述都在代码中. 不多说了,直接贴代码了.相信大家都能够看得懂的! package cn.yw.bore; import java.util.ArrayList; im ...

  3. 一步一步掌握java的线程机制(二)----Thread的生命周期

    之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是a ...

  4. 【Linux】线程并发拷贝程序

    据说大连某211高校的李教授越来越重口.不仅延续要求他所带的每个本科班.都要写一份线程并发拷贝程序的传统,并且还開始规定不能用Java语言写作.导致我之前写的<[Java]线程并发拷贝程序> ...

  5. Shell-使用mkfifo实现多任务并发及并发数控制

    以下为代码实现的一个模拟场景:3个生产者,在不断提供服务,处理需求,假设1s处理一个. 20个消费者,在不断消耗供给产品,提交需求,假设3s消耗一个. 情景分析:由于消费者的提交需求能力 和 生产者处 ...

  6. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  7. 【Java并发专题之二】Java线程基础

    使用线程更好的提高资源利用率,但也会带来上下文切换的消耗,频繁的内核态和用户态的切换消耗,如果代码设计不好,可能弊大于利. 一.线程 进程是分配资源的最小单位,线程是程序执行的最小单位:线程是依附于进 ...

  8. Java并发编程(二)创建线程的三种方法

    进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...

  9. java架构《并发线程高级篇二》

    本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...

  10. java并发编程(二)----创建并运行java线程

    实现线程的两种方式 上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节.实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口.当然还有第三种方式,那 ...

随机推荐

  1. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  2. トヨタ自動車プログラミングコンテスト2024#7(ABC 362)

    非常好名次,使我的 \(1\) 旋转 四发罚时应该是这次比赛最唐的东西了,没有就进前一千了 A.Buy a Pen 特判秒了,懒得打三种 ans=,所以就把不能选的那个赋值成无穷大了 #include ...

  3. 【赵渝强老师】在MongoDB中使用游标

    一.什么是游标? 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标实际上是一种能从包括多条数据记录的结果集 ...

  4. 更强的RAG:向量数据库和知识图谱的结合

    传统 RAG 的局限性 经典的 RAG 架构以向量数据库(VectorDB)为核心来检索语义相似性上下文,让大语言模型(LLM)不需要重新训练就能够获取最新的知识,其工作流如下图所示: 这一架构目前广 ...

  5. Awesome-Visual-Captioning

    目录 Table of Contents Paper Roadmap ACL-2021 CVPR-2021 AAAI-2021 ACMMM-2020 NeurIPS-2020 ECCV-2020 Vi ...

  6. KubeSphere 在互联网电商行业的应用实践

    来自社区用户(SRE运维手记)投稿 背景 在云原生的时代背景下,Kubernetes 已经成为了主流选择.然而,Kubernetes 的原生操作复杂性和学习曲线较高,往往让很多团队在使用和管理上遇到挑 ...

  7. 使用 KubeEye 为你的 K8s 集群安全保驾护航

    作者:KaliArch(薛磊),某Cloud MSP服务商产品负责人,熟悉企业级高可用/高并发架构,包括混合云架构.异地灾,熟练企业DevOPS改造优化,熟悉Shell/Python/Go等开发语言, ...

  8. node.js安装及环境配置基于Windows系统

    node.js安装及环境配置-Windows系统 1. 下载安装包 https://nodejs.org/zh-cn/download/ 根据自己电脑系统及位数选择,我的电脑是Windows系统.64 ...

  9. 在Lua中实现Rust对象的绑定

    实现目标:能将Rust对象快速的映射到lua中使用,尽可能的简化使用. 功能目标 以struct HcTestMacro为例: 类型构建,在lua调用local val = HcTestMacro.n ...

  10. 从围绕API到围绕数据-使用流式编程构建更简洁的架构

    背景 在服务刚刚搭建时,通常的思维就是根据API编写业务逻辑: // SendStream ... func (d *Svc) SendStream(stream MyApi_data.ProxyDi ...