`
youyu4
  • 浏览: 435364 次
社区版块
存档分类
最新评论

锁、分布式锁、无锁分布式无锁

 
阅读更多

锁、分布式锁、无锁分布式无锁

 

 

为什么要有锁?

 

      保证资源线程安全,简单说就是在多线程情况下不会乱。

 

 

 

锁的分类

 

  • JVM锁:类锁、对象锁、偏向、公平、重入、死锁
  • 分布式锁:Redis、DB、zookeeper

 

 

类锁和对象锁的区别

 

类锁

 

  1. 方法中写着static synchronized
  2. 整个Object.class只有一个锁,所有对象只有一个锁

 

对象锁

 

  1. 方法声明中只写synchronized
  2. Object的实例化对象object1、object2、object3,各有一个自己的锁

 

 

 

JVM锁如何实现

 

同步方法

 

public synchronized void save(){}

 

注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

 

 

 

同步块

 

synchronized(object){ 

}

     

注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 

 

 

 

volatile

 

  1. volatile关键字为域变量的访问提供了一种免锁机制, 
  2. 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新, 
  3. 因此每次使用该域就要重新计算,而不是使用寄存器中的值 
  4. volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 

注:这个虽然能实现线程安全,但是没有原子性,如(i++)

 

 

 

重入锁:ReenreantLock

 

  1. ReentrantLock() : 创建一个ReentrantLock实例 
  2. lock() : 获得锁 
  3. unlock() : 释放锁 

注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用

 

 

 

并发集合、并发工具类

 

  • ConcurrentHashMap
  • CopyOnWriteArrayList
  • 并发工具类:java.util.concurrent(JUC)

 

 

原子操作:Atomic

 

 

使用局部变量实现线程同步:ThreadLocal

 

 

 

分布式锁

 

Redis

 

  • 单线程,速度快,单点
  • 加锁:setNx()、取锁:getNx()
  • 或者setString也可以实现分布式锁

 

DB

 

悲观锁:select * from table for update(Quartz)

乐观锁:加多个version字段

 

 

Zookeeper:待学习。。。。。

 

 

 

无锁、分布式无锁

 

同样是使用redis实现,用它的自增功能,jedis.incr()

分享到:
评论

相关推荐

    锁、分布式锁、无锁实战全局性ID

    锁、分布式锁、无锁实战全局性ID锁、分布式锁、无锁实战全局性ID锁、分布式锁、无锁实战全局性ID锁、分布式锁、无锁实战全局性ID锁、分布式锁、无锁实战全局性ID

    分布式 并行计算 无锁编程

    ### 分布式并行计算与无锁编程 #### 一、无锁编程概述 无锁编程作为一种先进的并行处理技术,在提高系统效率的同时,能够有效减少由传统锁机制带来的问题。传统的锁机制虽然能保障数据的一致性和完整性,但在多...

    分布式无锁站点健康检查工具 Checkup.zip

    Checkup 是用 Go 写的分布式的,无锁的,自托管的健康检查工具和状态页面。它拥有一个优雅,简约的 CLI 和一个地道的 Go 库,他们是完全可互操作的,他们的配置是精美对称的。简介:Checkup 可以定制随时检查您的...

    并发编程下的锁机制,乐观锁、悲观锁、共享锁、排他锁、分布式锁、锁降级原理篇

    本文将详细讲解几种常见的锁机制:悲观锁、乐观锁、共享锁和排他锁,并简要介绍分布式锁以及锁降级原理。 1. **悲观锁**: 悲观锁是一种保守的策略,它假设在读取数据时,数据极有可能被其他线程修改。因此,悲观...

    分布式环境下的解决方案-分布式锁.docx

    3. 锁状态:至少有两种状态来表示锁的持有情况,例如有锁/无锁、存在/不存在等。这通常通过特定的标记或数值来表示,如Redis的`setnx`命令用于设置键并返回设置成功与否。 4. 原子性操作:在分布式环境中,确保锁...

    分布式锁与信号量:同步机制的探讨与实践.pdf

    - **无锁机制**:信号量通常实现为无锁机制,能够有效地避免锁竞争和死锁的问题。 #### 三、分布式锁与信号量的应用场景 - **分布式锁的应用场景**: - **数据一致性**:在分布式数据库系统中,分布式锁可以确保...

    分布式锁与信号量avaWeb-mast开发笔记

    另外,结合具体的业务场景,选择合适的实现方式,如基于缓存的分布式锁、基于数据库的悲观锁或乐观锁,甚至是基于算法(如CrDT)的无锁数据结构。 总之,分布式锁与信号量是分布式系统中不可或缺的工具,它们帮助...

    SnowJena:Distributed lock-free current limiting framework based on token bucket algorithm.基于令牌桶算法实现的分布式无锁限流框架

    基于令牌桶算法实现的分布式无锁限流框架,支持动态配置规则,支持可视化监控,开箱即用。 Document 使用文档:| 功能概要 限流 降级 授权 注解 监控 黑名单 白名单 控制台 分布式 高可用 设计模式 单例模式 观察者...

    分布式OS

    有两种常见的互斥算法:基于锁的算法和无锁算法。 基于锁的算法是最常见的互斥策略,包括简单互斥量(Mutex)、信号量(Semaphore)和读写锁等。简单互斥量允许只有一个进程访问资源,其他进程必须等待互斥量被释放...

    详细解读分布式锁原理及三种实现方式

    分布式锁是一种在分布式系统中确保数据一致性的重要工具。在分布式部署的环境中,由于多台服务器间的数据交互,数据一致性成为了一大挑战。CAP理论指出,任何分布式系统都无法同时保证一致性(C)、可用性(A)和...

    浅谈分布式锁的几种使用方式(redis、zookeeper、数据库)

    分布式锁是一种在分布式系统中确保同一资源在同一时刻只被一个客户端使用的机制,它解决了多节点并发访问共享资源的问题。在微服务和云架构中,分布式锁是不可或缺的组件,能够防止数据不一致性和并发问题。本文将...

    无锁并行框架Amino -- Concurrent Building Blocks

    无锁算法是其核心,这种算法避免了传统的互斥锁带来的性能瓶颈,提高了程序的并发性和可扩展性。 在传统的多线程编程中,互斥锁被广泛用于保护共享资源,但频繁的锁操作会导致上下文切换,从而影响整体性能。无锁...

    tla-rust:在TLA +的协助下,在Rust中编写正确的无锁和分布式状态系统

    - 无锁编程(Lock-Free Programming)通过原子操作(Atomic Operations)实现共享数据的并发访问,避免锁导致的性能瓶颈和死锁问题。 - Rust的`std::sync::atomic`库提供了各种原子类型和操作,支持无锁编程实践。...

    分布式缓存

    - 缓存击穿:针对特定热点数据的大量请求,可能导致某节点压力过大,可以使用读写锁或者预热策略解决。 通过学习“深入分布式缓存:从原理到实践”,读者可以深入了解分布式缓存的全貌,理解其背后的理论基础,...

    AspNetCoreHighConcurrency.Sample:AspNetCore高并发简单代码。描述如何使用基于Redis的分布式锁定。 无锁和排队的商品库存操作

    AspNetCoreHighConcurrency.Sample AspNetCore高并发示例代码。描述如何使用基于Redis的分布式锁定。...1.基于redis的分布式锁 2,基于Redis的原子操作使用lua脚本 3,基于Redis的原子操作使用Lua脚本和Kafka

    基于无锁数据结构的FIFO队列算法.pdf

    在多核处理器中,由于硬件级别的锁可能导致处理器等待和性能瓶颈,无锁数据结构显得尤为重要。这篇文章介绍了一种基于无锁数据结构的FIFO(先进先出)队列算法,该算法被设计为一种高效的核间通信机制。 无锁数据...

    分布式数据确认架构.pptx

    3. **无锁算法**:使用替代机制,如乐观并发控制等方法来实现锁的功能。 #### 四、确认系统的容错性和可扩展性 - **容错性**:设计确认系统时需考虑在网络中断、节点故障等情况下的容错能力,确保系统的正常运行。...

    java8看不到源码-dlock:一种有效可靠的分布式锁

    分布式锁 DLock 是 Java 实现的、有效且可靠的分布式锁。 它使用Redis存储锁对象,通过[Lua](脚本)对锁进行原子操作。基于Redis的过期机制,DLock实现了锁[租借](以保证释放。为了提供高性能,DLock采用进程级锁模型...

    无锁缓冲队列

    在实际应用中,无锁缓冲队列常用于消息传递、事件驱动系统、并发数据库和分布式系统等领域。对于高并发和低延迟的场景,无锁缓冲队列能够提供显著的优势。然而,在选择是否使用无锁缓冲队列时,开发者需要权衡其性能...

Global site tag (gtag.js) - Google Analytics