多线程(锁策略, synchronized 对应的锁策略)

简介: 多线程(锁策略, synchronized 对应的锁策略)

锁策略

锁策略?锁机制?锁特性? 大概可以这么理解吧, 根据不同的使用场景和需求, 锁有不同的特性供实现者选择

也可以说是: 当出现锁竞争时, 不同加锁机制的特点

再或者说: 是锁的形容词

以下是几种常见的锁策略

乐观锁 vs 悲观锁

乐观锁: 预测锁的竞争不会很激烈, 因此会少做一些工作 (假设数据一般不会出现并发冲突, 因此当数据进行提交的时候, 才会对数据进行检测, 如果判断出现了并发冲突, 就返回信息给用户, 让用户决定如何去做)

乐观锁一般是基于 版本号 这样的机制来实现的, 就是该做的还是会做, 做完了会基于版本号回滚,报错 …

悲观锁: 预测锁的竞争会很激烈, 因此会多做一些工作 (每次使用数据都会上锁)

悲观锁是直接不让你用, 如果该资源已经被使用, 那么你就阻塞等待锁释放就好了

轻量级锁 vs 重量级锁

轻量级锁 加锁解锁 的开销比较小, 效率高 (多数情况下, 乐观锁也是一个轻量级锁)

重量级锁 加锁解锁 的开销比较大, 效率低 (多数情况下, 悲观锁也是一个重量级锁)

换句话说

效率高的锁就是轻量级锁

效率低的锁就是重量级锁


自旋锁 vs 挂起等待锁

自旋锁: 在产生所冲突时, 自旋锁会不断的尝试去竞争锁

挂起等待锁: 在产生冲突时, 挂起等待锁不会主动去竞争锁, 而是等锁资源被释放, 被动通知你可以来进行锁竞争


互斥锁 vs 读写锁

互斥锁: 例如 sychronized , 提供加锁和解锁两个操作, 如果一个线程加锁, 另一个线程也加锁, 就会产生阻塞

读写锁: 提供三种操作

  1. 针对读加锁
  2. 针对写加锁
  3. 解锁

读写锁中约定

  • 读锁和读锁之间没有锁冲突
  • 写锁和写锁之间锁冲突
  • 读锁和写锁之间锁冲突

公平锁 vs 非公平锁

公平锁: 当一个线程结束对某个资源的占有, 由下一个线程来获取该资源, 而下一个线程所在的就绪队列, 是有序的, 先来先到, 依次获取锁

非公平锁: 当一个线程结束对某个资源的占用, 由就绪队列中的所有线程进行抢占式获取锁, 而不是按照时间顺序, 先到先得


可重入锁 vs 不可重入锁

可重入锁: 一个线程针对一把锁, 连续加锁多次不会产生死锁

不可重入锁: 一个线程针对一把锁, 连续加锁两次就会产生死锁


以 Synchronized 为例, 对应锁策略

  1. synchronized 既是悲观锁, 也是乐观锁 (默认是乐观锁, 如果锁竞争比较激烈, 就会变成悲观锁)
  2. synchronized 既是轻量级锁, 也是重量级锁 (默认是轻量级锁, 如果锁竞争比较激烈, 就会转变成重量级锁)
  3. synchronized 的轻量级锁, 是基于自旋锁的方式实现的
    synchronized 的重量级锁, 是基于挂起等待锁实现的
  4. synchronized 是互斥锁
  5. synchronized 是非公平锁 (抢占式执行)
  6. synchronized 是可重入锁

目录
相关文章
|
27天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
28天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
54 3
|
25天前
|
Java 关系型数据库 MySQL
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化
|
2月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
47 6
|
2月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
52 4
|
2月前
|
Java
线程池内部机制:线程的保活与回收策略
【10月更文挑战第24天】 线程池是现代并发编程中管理线程资源的一种高效机制。它不仅能够复用线程,减少创建和销毁线程的开销,还能有效控制并发线程的数量,提高系统资源的利用率。本文将深入探讨线程池中线程的保活和回收机制,帮助你更好地理解和使用线程池。
132 2
|
3月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
82 4
|
3月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
37 2
|
3月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
64 0
|
3月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
36 0