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. 反DDD模式之“复用”

    本文书接上回<反DDD模式之关系型数据库>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视频 ...

  2. [Tkey] 生日礼物

    题意简述 彩珠有 \(n\) 个 \(k\) 种,每个珠子都有一个坐标 \(p_{i}\),求最小的区间长度,使得这个区间包含全部的 \(k\) 种彩珠. 分析 发现我们可以维护每一种颜色的最近出现坐 ...

  3. Makefile优化编译速度

    并行编译:使用 make -j 命令来进行并行编译,可以加快编译速度.-j 后面可以跟一个数字,表示并行编译的线程数. 懒惰计算:使用 .PHONY 规则来避免无谓的重新编译.该规则告诉 make,这 ...

  4. Android dtbo(1) dto简介

    设备树 (DT, Device Tree) 是用于描述 non-discoverable(google这样写的,意思应该就是硬件信息看不到) 硬件的命名节点和属性构成的一种数据结构.操作系统(例如在 ...

  5. 强化学习笔记之【SAC算法】

    强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...

  6. python的十大数据结构之堆队列heapq(heap queue)

    heap queque(堆队列),是一个完全二叉树,并且满足一个条件:每个节点(叶节点除外)的值都大于等于(或小于等于)它的子节点.提供了构建小顶堆的方法和一些小顶堆的基本操作方法(如入堆.出堆等), ...

  7. 『玩转Streamlit』--环境配置

    尽管Streamlit的使用非常直观,但正确的环境配置对于充分发挥其潜力仍然至关重要. 本篇将介绍如何从头开始配置Streamlit环境,以及Streamlit开发过程中常用的几个命令. 最后通过一个 ...

  8. 云原生周刊:KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard

    开源项目推荐 Admiralty Admiralty 是一个 Kubernetes 控制器系统,可以智能地在多个集群之间调度工作负载.它使用简单,并且易于与其他工具集成. Cozystack Cozy ...

  9. 在 Azure CNI 中启用 Calico WireGuard

    作者:Peter Kelly 译者:Wendi Wang 注:本文已取得作者本人的翻译授权! 去年6月,Tigera 宣布首次在 K8s 上支持用于集群内加密传输的开源 VPN - WireGuard ...

  10. activiti教程

    一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进行传递文档.信息或任务的过程,从 ...