走进舒适圈の小窝

Loading...

Java并发 —— 线程并发(二)

Java 锁


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

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

保持数据一致性的方法

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

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

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

悲观锁

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

Java 中悲观锁有哪些

  • synchronized关键字

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

    使用方式:

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

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

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

  • AQS 框架

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

乐观锁

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

 实现方式:

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

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

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

posted @ 2024-12-10 11:06  走进舒适圈  阅读(9)  评论(0编辑  收藏  举报