• 关于多线程:锁的原理释义


    线程实现方式

    继承 Thread
    
    实现 Runabled
    
    ExecutorService
    
    Callable Future带返回值的多线程操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    多线程的生命周期

    创建、初始化(就绪)、运行、堵塞、退出
    
    • 1

    Volatile的原理:

    对于申明了 Volatile的变量进行写操作的时候,会向处理器发送一条Lock前缀的指令。会把这个变量所在缓存行的数据写回到系统内存。如果有另一个线程来修改,就会效验一下这个lock,不对的时候就重新获取系统内存的值(类似版本锁)。

    内存屏障:

    内存屏障是被插入两个CPU指令之间的一种指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障有序性的。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将写缓冲器的值写入高速缓存,清空无效队列,从而“附带”的保障了可见性.

    指令重排(happen-before):

    在虚拟机层面,减少内存操作速度慢于cpu运行速度带来的cpu空置期间,虚拟机会安装默认规则将程序顺序打乱执行—即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行——以尽可能充分地利用CPU

    在硬件层面,CPU将接收到的一批指令按照其规则重排序,同样是基于CPU速度比缓存速度快的原因,只是硬件处理的话,每次只能在接收到的有限指令范围内重排序。

    Synchronized的原理:

    对于申明syncronized的方法或对象操作时,有个监视器monitor,线程访问的时候,会获得这个锁。成功后就操作,如果获得锁失败的放到锁队列里,当上一个线程执行完才可以从队列里继续获得锁。

    Synchronized: 无锁->偏向->轻量->重量

    (默认是无锁的,当线程来同时调用的时候就转成偏向锁,当多个线程同时竞争时就转为轻量级锁,当大数据量线程来调用且来不及处理的时候就会从轻量级锁切换成重量级锁)

    ReentrantLock:可重入锁

    lock:可主动释放锁,常用于方法体内。.

    公平锁:根据等待时间越长获取锁的几率越大,确保公平

    分布式锁

    zookeeper分布式锁:根据zk的树形结构,他有临时节点,持久化节点,当有服务数据进来,默认分配一个id创建临时节点做id存储(id有序),然后根据最小节点的id来执行获取锁,确保有序执行。其中还提供的watch机制监听,当节点不可用时会自动销毁。

    redis分布式锁

    setnx:分布式锁
    
    • 1

    redlock:每个节点独立,根据ttl过期时间并且大于一半节点能获取到锁,表示锁能成功获取,否则释放。主要防止单点故障

  • 相关阅读:
    【C++】内存管理
    数学建模 (一)赛前准备
    演示命令执行漏洞无回现如何渗透
    win10提示mfc100u.dll丢失的解决方法,快速解决dll问题
    驱动开发1 概念、内核模块编程、内核消息打印函数printk函数的使用、内核模块传参、内核导出符号
    苹果开发者账号绑定设备已满
    如何在 PyQt 中实现异步数据库请求
    python+django汽车租赁系统pycharm项目
    多网络设备存在时,如何配置其上网优先级?
    Prometheus+Grafana可视化监控【主机状态】
  • 原文地址:https://blog.csdn.net/qq_20057315/article/details/128202319