锁是什么

锁在现实生活意义在于通过加锁的方式达到隐私保护或者独占的意义。
锁在程序世界里,加锁是方法,目的在于①独占②同步。

多线程锁–锁的源起

1.为了尽可能压榨CPU资源,神奇的码农们发明了轻量级进程LWP,即线程,线程越多抢占CPU机会越大。
2.但同时也带来了隐患,线程上下文切换(保护当前线程案发现场,调度新线程)导致的效率低下,还得考虑线程之间的通信,及与之带来的线程的同步问题。
3.但快速带来的好处远比隐患好的多,所以得考虑如何消除存在的问题。
4.故定义了并发的时候得考虑三个因素,可见性,原子性,有序性。5.关于线程通信有两种方式:a)通过共享内存(堆与离堆)实现的隐式通信,b)通过消息传递(wait,notify,notifyall)的显式通信
6.关于线程同步有两种方式:a)通过加锁方式实现的显式同步-->堂而皇之加个锁,自己操作完后将操作完的内容,即工作内存上的内容同步到其他线程可见的共享内存上去b)通过消息传递(wait,notify,notifyall)的隐式同步 7.总结:多线程存在资源冲突问题,加锁是一种手段,目的是独占中解决同步问题从而达到资源不冲突。

多线程–锁的分类

1.多线程存在资源冲突的问题,是铁板的事实,但其实解决这个问题因人而异
2.有些人天生悲观,通过加锁去解决问题,锁的种类主要有:a)sync:jvm底层实现的,锁是被动释放b)lock:jdk下juc包实现的,锁可主动释放c)上面的a)b)都属于时间换空间来解决资源冲突问题,其实还可以通过ThreadLocal这种空间换时间的方法来解决资源冲突问题ps:volatile关键字可以使得缓存副本(工作内存)失效从而解决资源冲突问题
3.有些人天生乐观,通过Atomic包(底层CAS机制)实现无锁解决资源冲突

分布式锁–锁的源起

1.前面讲了线程级别的通过锁来解决资源冲突的问题,他们都属于进程,所谓进程其实考虑的也就是①资源分配-->共享②执行调度-->cpu调度-->线程宠幸
2.分布式架构中进程分布在各个不同机器中,他们为了抢占某个资源该如何解决冲突呢。
3.其实理念都是差不多的,还是通过锁,我们称之为分布式锁

分布式锁-常见的解决方案

1.传统RDB数据库中增删记录以达到加锁释放锁的功能
2.高速KV数据库Redis中增删字段以达到加锁释放锁的功能
3.Zookeeper中增删临时有序节点以达到加锁释放锁的功能

分布式锁-Redis实现

 1. 第一版:用 setnx(set if not exists) 指令加锁,用del指令释放锁
存在的问题:得到锁的进程途中出现异常,锁无法释放2. 第二版:用set key value ex time nx指令引入过期释放策略,到时间了就释放,解决了出现异常后死锁的问题
存在的问题:得到锁的进程超时出现,释放锁的时候将其他进程的锁错误释放3. 第三版1:释放锁的时候加入进程ID的判断或者随机数的判断后再释放锁4. 第三版2:  因判断与删除非原子操作,使用Lua脚本将这段代码封装称原子操作5. 第四版:第三版只解决了误删的问题,并没有解决乱象问题,故获得锁的线程开启一个守护线程,用来给快要过期的锁“续航”。

分布式锁-ZK实现

 1. 回顾:Znode分为四种类型:持久节点,持久顺序节点,临时节点,临时顺序节点2. ZK分布式锁的实现通过 1个持久节点+n个临时顺序节点3. 加锁:创建持久节点ParentLock,客户端进程进来,在ParentLock这个节点下面创建一个临时顺序节点,排序后顺序在最前面的那个进程为抢到锁的进程,其余则依次注册为Watcher就如这样形成了锁队列,箭头方向为watch方向:lock1<---lock2<---lock3<---lock44. 释放锁:获得锁的客户端任务完成或者挂掉了后会删除Znode,Watcher收到通知后获得锁。

锁锁锁-多线程锁-多进程锁相关推荐

  1. 网络爬虫--18.python中的GIL(全局解释器锁)、多线程、多进程、并发、并行

    参考文献: python的GIL.多线程.多进程 并发和并行的区别? GIL(全局解释器锁)一看就懂的解释! 多谢作者分享!

  2. Java多线程系列---“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下: 01. Java多线程系列--"JUC锁"01之 框架 02. Java多线程系列--"JUC锁 ...

  3. 【C++】多线程与互斥锁【二】

    文章目录 1. 并发是什么 1.1 并发与并行 1.2 硬件并发与任务切换 1.3 多线程并发与多进程并发 2. 为什么使用并发 2.1 为什么使用并发 2.2 并发和多线程 3. 并发需要注意的问题 ...

  4. python 多线程讲解(如何实现多线程,递归锁,互斥锁,信号量,事件等)

    什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同 ...

  5. 基于redis分布式锁实现的多线程并发程序(原创)

    前两个版本的代码 都或多或少存在一定的问题,虽然可能微乎其微,但是程序需要严谨再严谨 第一个版本问题:  局限于单机版,依赖于 Jvm的锁 第二个版本问题:  极端情况下,解锁逻辑的问题,线程B的锁, ...

  6. 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池

    递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...

  7. 基于redis分布式锁实现的多线程并发程序

    前两个版本的代码 都或多或少存在一定的问题,虽然可能微乎其微,但是程序需要严谨再严谨, 第一个版本问题: 局限于单机版,依赖于 Jvm的锁 第二个版本问题: 极端情况下,解锁逻辑的问题,线程B的锁,可 ...

  8. 关于python多线程,线程锁,线程池开发接口测试脚本真实实例,用于测试时间节约

    场景:现在测试场景为,某个抢购场景,抢购时间只有10秒,测试人员需要5个拥有优惠券的账号,然后5个账号为业务关联的账号同时去抢购 过程:每个账号涉及调用一次购买接口,涉及一次SQL查询 首先我们先定义 ...

  9. python-Threading多线程之线程锁

    Threading多线程之线程锁 这里先说一下加锁的机制,其是如何实现线程保护的.这个实现的大致过程为:首先在需要同步的代码块前面加上lock.acquire()语句,表示需要先成功获取该锁,才能继续 ...

最新文章

  1. java 基础算法教程ppt,基础排序算法(附加java实现)
  2. R语言使用compareGroups包compareGroups函数生成表统计表、createTable函数创建二元表、并导出结果到文档(doc、csv、xlsx、pdf)
  3. C语言 基础60题(5)
  4. 生活中的算法---公交换乘
  5. Mybatis的动态查询
  6. 关于NullPointerException
  7. java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2
  8. GET和POST方式提交参数给web应用
  9. 一个讲课截屏 清明DAY2
  10. C/C++[codeup 1944]八进制
  11. python指数函数,幂函数
  12. 施耐德PLC Unity Pro xl 软件使用四
  13. 概要设计的必要性及写法
  14. iPad谷歌浏览器怎么开摄像头_谷歌浏览器网页截图的步骤_谷歌浏览器怎么截图...
  15. 打开我的计算机我的文档不见,我电脑桌面上的我的文档不见了,是什么原因造成我的文档不见了呢?是? 爱问知识人...
  16. Cut the Cake!题解
  17. CC2640R2FRSMR低功耗M3内核蓝牙MCU
  18. 纺织品有害物质三项检测
  19. 自动化控制重要国际学术会议
  20. 多线程应用_左圆右方

热门文章

  1. while和do...while的区别
  2. 下载项目中的excel模板文件.xlsx后,无法打开的问题
  3. 如何给VS_code更换背景图片
  4. eclipse Debug 初尝试 (09.10教师节(*^▽^*))
  5. Windows平台Go语言环境搭建
  6. armbian安装pillow报错解决
  7. IIS服务在局域网中访问不了?
  8. 便携式存储计算机技术方案,用于便携式存储器件的动态文件系统限制技术方案...
  9. [从头读历史] 第308节 星球战争 BC2599 至 BC2500(公元前26世纪)
  10. 计算机二级考试准备多长时间,计算机二级高效备考方法,你知道吗?