一句话说清分布式锁,进程锁,线程锁

  在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁。

线程锁,进程锁,分布式锁

  线程锁:大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对象中的非加锁代码块的。

  进程锁:也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。

  分布式锁:当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6384105.html

分布式锁到底是什么,怎么实现?

  intsmaze说简单点,实现分布式锁必须要依靠第三方存储介质来存储锁的元数据等信息。比如分布式集群要操作某一行数据时,这个数据的流水号是唯一的,那么我们就把这个流水号作为一把锁的id,当某进程要操作该数据时,先去第三方存储介质中看该锁id是否存在,如果不存在,则将该锁id写入,然后执对该数据的操作;当其他进程要访问这个数据时,会先到第三方存储介质中查看有没有这个数据的锁id,有的话就认为这行数据目前已经有其他进程在使用了,就会不断地轮询第三方存储介质看其他进程是否释放掉该锁;当进程操作完该数据后,该进程就到第三方存储介质中把该锁id删除掉,这样其他轮询的进程就能得到对该锁的控制。

  说了这么多,再补充一点,线程锁,进程锁,分布式锁的作用都是一样的,只是作用的范围大小不同。范围大小:分布式锁——大于——进程锁——大于——线程锁。能用线程锁,进程锁情况下使用分布式锁也是可以的,能用线程锁的情况下使用进程锁也是可以的。只是范围越大技术复杂度就越大。

多年j2EE开发生涯从未感觉到分布式锁的痛点!!!

  关于分布式锁,有过javaEE开发经验的就会说了,系统为了应对高并发,会搭建一个比如tomcat集群,集群内服务都是访问的同一台数据库,有多台服务器同时修改同一条数据库数据的操作,但是我们并没有在服务器中使用分布式锁?按照上面对分布式锁的解释,两个不同系统上的JVM进程同时访问数据库的同一个资源,这个时候我们应该使用分布式锁进行控制。

  这说的没有错,但是我们忘记了数据库的特性了。如果两台服务器仅仅是直接访问(通过url)并操作某台服务器硬盘中某个文件同一行数据,这个时候我们必须用分布式锁。但是因为这两台服务器访问的数据是存储在数据库中的(数据库本身就是一个服务程序,多线程的接收外部系统发来的请求),两台服务器的请求通过网络IO发送到数据库服务器后,然后把请求交给数据库服务的进程处理,数据库服务器是多线程接收请求并处理的,这个时候关于某表某一行数据的多线程访问控制是由数据库服务进行控制的(就是数据库服务的代码中进行了线程上的加锁处理),这就是数据库服务器的行锁等特性,因为数据库那一端已经对外部多个系统的请求进行了一个锁操作,所以不需要我们在应用服务端进行分布式锁的开发。 

  那如果想同时更新数据库的多行数据,这个时候数据库的行锁就无法保证了。这个时候我们就要使用分布式锁,是的这个时候就可以使用,注意我用的是可以。为什么说可以呢?因为数据库本身就提供了这个机制,事务以及他的隔离级别。当然你也可以不用数据库提供的事务,用分布式锁。

分布式锁的设计不需要考虑业务吗?

  分布式锁的设计并不是完全美好的,只能针对某些业务场景下使用,如果要对所有业务使用,必须充分理解业务需求合理的设计,至于原因就和各位j2ee开发时mybatis的二级缓存以命名空间为单位所要注意的业务问题时一样的。  

  intsmaze使用分布式锁,我们会把某表的第二第三行作为id来锁住,如果有相同的操作时更新该表第二第三行,我们才不让他修改,必须让他拿到锁才可以。但是如果有个操作仅仅是修改第二行,这个时候他就获得了对该行的操作,而且等数据库释放掉之前操作对该行的锁后。所以分布式锁并不是随处可用的,只是在某些场景下可以使用。比如业务系统不会存在单独修改第二行的操作。

分布式锁用于hbase存储系统

  实际开发场景中,我们会对hbase操作进行分布式锁,hbase作为一款优秀的非内存数据库,传统数据库一样提供了事务的概念,只是HBase的事务是行级事务,可以保证行级数据的原子性、一致性、隔离性以及持久性,即通常所说的ACID特性。为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。因为hbase只支持行级事物,当业务需要并发操作两行甚至多行记录时,hbase本身就无法提供ACID的支持了。

数据库访问量过大除了主从还能如何负载压力?

  数据库会为客户端的每一个请求创建一个线程,这些线程针对特定行数据修改必须获得该行的行锁,而其他客户端线程要想修改该数据的话,必须等待前面的线程释放锁后才被允许。如果客户端很多线程都要修改某行数据的话,没有拿到锁的线程都会在数据库端机器上不断轮询,增大数据库端的压力。

  我们可以使用分布式锁,把对数据库行锁的等待获取的轮询放到每一个客户端机器上去实现,这样可以避免数据库端线程的不断轮询。比如,客户端在要发送对数据库的某行数据的操作请求前,在客户端机器上进行锁的争抢,没有获取到锁,就不会像数据库端发送操作请求,这样数据库端就没有了轮询的压力。当然分布式锁的引入一定要结合业务的需求来进行设计,不然会出现锁id的命名不全导致读取的数据不一致,数据过期失效等问题。

使用那种第三方介质存放分布式锁?

  目前流行的是zookeeper和redis,两者各有好处,redis流行的内存缓存,且能进行水平扩容同时还能提高请求负载,面对高并分布式锁数据的读写请求能高速响应,同时有aof,哨兵机制可以防止某台宕机分布式锁数据丢失带来的问题。

  zookeeper我是比较喜欢,因为他是分布式一致性算法paxos算法的实现,面对高负载请求毫无压力,同时某一台宕机毫不影响分布式锁数据一致性,且附带了监听机制,当某一程序释放某一个锁后,其他程序可以及时得到通知来获得对该分布式锁的控制权,这里的轮询实现不需要我们去开发了。

  关于分布式锁与线程锁的介绍从一年前就在编辑中,一直没有时间以一种通俗明了的方式介绍给大家。本人在很多论坛中发现很多刚入大数据领域的新人都会提到分布式锁,但是并没有深刻明白分布式锁和线程锁的场景,以至于很多情况下明明线程锁就可以搞定的却引入了分布式锁,让整个系统设计的更加复杂了。

  另外要说的,zookeeper笔者认为是很棒的技术,虽然在大数据领域只是作为某一个框架的一个协调者出现,导致很多开发者忽视了他的伟大性。但是我想说的,在当前火热的微服务中,其实会借助zookeeper实现很多功能,比如分布式锁,配置中心。

http://www.cnblogs.com/intsmaze/p/6384105.html

一句话说清分布式锁,进程锁,线程锁相关推荐

  1. 正在等待缓存锁:无法获得锁_一句话说清分布式锁,进程锁,线程锁

    推荐阅读 1. Java 性能优化:教你提高代码运行的效率 2. Java问题排查工具清单 3. 记住:永远不要在MySQL中使用UTF-8 4. Springboot启动原理解析 在分布式集群系统的 ...

  2. 嵌入式 linux 进程锁,嵌入式  Linux线程锁详解pthread_mutexattr_t

    在Posix Thread中定义有一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALI ...

  3. python 线程锁_Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  4. 线程锁与避免线程锁 线程锁检测

    进程是资源共享的,线程是资源私有的. 死锁的四个必要条件 在计算机专业的本科教材中,通常都会介绍死锁的四个必要条件.这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生.我们来复习一 ...

  5. 深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 1)

    在 使用 redis 实现分布式锁 之前 我们需要先了解以下几点 什么是分布式锁 要介绍 什么是分布式锁,那首先要提到 与之对应的 的两个锁:线程锁 和 进程锁 1.线程锁 主要 用来 给方法.代码块 ...

  6. 线程锁/进程锁/文件锁

    > 线程锁/进程锁/文件锁  1.线程锁是锁线程的,锁住禁用,如果4线程的CPU锁一个线程剩余三个(如果可以锁的话),就像四车道封锁一条车道还剩3个车道可以跑车:  2.进程锁是锁进程的,进程就 ...

  7. python多线程,线程锁

    python使用多线程, 不一定运行速度快,这里引入GIL(global interpreter lock) python解释器中任意时刻都只有一个线程在执行; GIL执行过程: 1). 设置一个GI ...

  8. python多线程之线程锁(Lock)和递归锁(RLock)实例

    一.线程锁 Threading模块为我们提供了一个类,Threading.Lock锁.我们创建一个该类对象,在线程函数执行前,"抢占"该锁,执行完成后,"释放" ...

  9. GIL锁,线程锁(互斥锁)和递归锁

    GIL锁(Global Interpreter Lock):CPython才会有(是这种解释器的历史遗留问题),Python程序执行前,先获得GIL锁,然后每执行100个指令,解释器就自动释放GIL锁 ...

最新文章

  1. VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案
  2. 【Linux】2_文件和用户管理
  3. [BUUCTF-pwn]——picoctf_2018_got_shell
  4. 《C++ Primer》第一章的 Sales_item.h头文件源码
  5. window设置快捷键左右方向键
  6. 请用旧版的 Scala-2.11 搭配 Spark-2.4.8 / hadoop-2.7
  7. 基于matlab的图像仿真研究,基于MATLAB的图像锐化算法研究与仿真
  8. Fiddler环境配置、抓包、手机代理
  9. unity 转微信小游戏快速创建流程
  10. 怎样在科学计算机上计算反正切,科学计算器使用教程_科学计算器怎么解方程...
  11. LC152---乘积最大子数组
  12. sqllabs详解与知识点汇总(内含代码审计)
  13. 从微信小程序到抖音小程序:转换指南
  14. 将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv)
  15. 什么是跨域(CORS)?怎么解决跨域(CORS)?
  16. ad域推送软件_Windows域推送软件、域推送安装msi程序、域推送安装软件的方法-MSI文件...
  17. CF 940E Cashback (DP+multiset)
  18. 在.NET中隐藏带有只读Web路径的Web shell
  19. 玛娜火花Mana Spark for Mac游戏介绍
  20. 包头市办理护照、港澳通行证流程

热门文章

  1. oracle中treat函数,Oracle 函数概览
  2. TensorFlow--实现人脸识别实验精讲 (Face Recognition using Tensorflow)
  3. 未来,大脑扫描背包将神经科学带入现实世界
  4. 深度神经网络对脑电信号运动想象动作的在线解码
  5. UE4全景插件Nvidia Ansel Photography
  6. 西湖首届本科生开招!每名学生配三位学术导师,大二全员海外交流
  7. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  8. Python之父,现在成为微软打工人
  9. 如何去掉桌面标签背影
  10. 利用circpedia 数据库探究circRNA的可变剪切