java锁概念的理解_分布式锁概念以及实现的理解

1、浅谈java中的锁解决了什么问题?

谈到锁,在java中我们可能经常听到一些锁概念,如公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等概念。这么多锁其实只为解决一个问题,那就是在多线程情况下访问临界资源的一种线程同步机制问题。

2、为什么要用分布式锁?

上面已经谈到在java中有如此多锁,为什么还要引入分布式锁的概念。其实在我们日常开发测试应用阶段,如果要共享一个变量对其进行多线程访问,我们只需要使用java基础中讲的syschrionzed或者lock,以及java并发包中的工具去做同步处理完全可以解决所有单机线程安全问题,切记这些技术只能解决单点应用的线程安全问题。注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

但是目前的互联网项目几乎都是集群分布式架构,每个应用都会部署多台服务然后做负载均衡,大致如下图所示:

f56cb7310792c509eb1838bf38d5c0ef.png

上图中变量var存在于三个JVM中,并不具有可见性和共享,这样是不对的。(这个变量具体到代码例如在OrderService中的一个成员变量)如果不加任何控制的话,变量var同时都会在JVM分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的!即使不是同时发过来,三个请求分别操作三个不同JVM内存区域的数据,变量A之间不存在共享,也不具有可见性,处理的结果也是不对的。

为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。

3、分布式锁的特点

(1)、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;

(2)、高可用的获取锁与释放锁;

(3)、高性能的获取锁与释放锁;

(4)、具备可重入特性;

(5)、具备锁失效机制,防止死锁;

(6)、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

4、分布式锁的三种实现方式 :

(1)、基于数据库的悲观锁实现;

(2)基于redis实现

(3)基于zookeeper实现

转载至链接:https://my.oschina.net/shxjinchao/blog/1926577

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值