并发编程概念的一些基本的了解是非常重要的。告诉我们认为表明,在方向上的主要问题。

这个讲锁的一些基本概念。

在正常情况下,我们说的锁都指的是“互斥”锁。因为有一些特殊的锁,例“读写锁”,一点都没有互斥。

排斥锁。

锁是处理并发的一种同步手段。单线程程序和并发程序的终于目的都是要保证程序的正确性,可是最大的差别是:

  • 单线程程序的正确性仅仅关注程序的执行结果和目标是一致的
  • 并发程序的正确性除了执行结果正确外,还包括了活性的特性,所谓活性,指的就是程序无死锁,无饥饿

所以考察一个锁,也须要从三个方面考察:

1. 相互排斥性

2. 无死锁

3. 无饥饿

最简单的锁仅仅保证相互排斥性,而相互排斥性本质上能够用一个布尔值表示,即一个二元状态。

相互排斥是保证并发程序正确性的一种特性。和相互排斥相关的一个专用名词就是临界区

临界区指的是“某个时刻仅能被一个线程运行的代码段”,也就是通常锁的被锁保护的代码段。

一个相互排斥锁的定义通常例如以下

interface Lock {public void lock();public void unlock();
}

线程必须用指定的方式使用锁。lock动作必须在try块之前调用,假设lock在try里面运行。可能会在取到锁之前抛出异常,导致运行了unlock动作,从而错误发生。

熟悉Java显示锁的同学肯定知道使用ReentryLock就是例如以下的使用方法。

mutex.lock();
try{...临界区
}finally{mutex.unlock()
}

相互排斥意味着串行,也意味着等待。 这引出了著名的Amdahl定律

Amdahl定律: 即完毕一个工作能获得的加速比,受限于这个工作中必须被串行的部分。

(通常串行部分都是由于被相互排斥锁保护了)

加速比的定义是一个处理器完毕一个工作的时间和採用n个处理器并发完毕该工作的时间比。

Amdahl定律给出的加速比方下S = 1 / ( 1 - p + p/n)S为加速比
1为完毕工作的时间
p指能够并行的部分
n指处理器个数

从Amdahl定律能够看出,串行的工作越多,获得的加速比就越小。

Amdahl给我们编程实际启发有:

1. 尽量减小相互排斥锁的粒度。锁粒度越小表示串行的部分越少

2. 能不用锁,就不要用锁。不用锁表示串行的部分越少

接下来说说活性相关的概念。

死锁意味者系统冻结终于相关的全部线程都永久地停滞等待。

饥饿则是总有一些线程可以执行一小部分线程永久停滞等待

所以无饥饿意味着肯定无死锁。可是无死锁不意味着无饥饿。

《多处理器编程的艺术》一书中给出了几种锁的实现,当中Peterson算法能够保证两个线程使用锁的时候锁具备相互排斥,无死锁。无饥饿特性。

class Peterson implements Lock {private boolean[] flag = new boolean[2];private int victim;public void lock(){int i = ThreadID.get();int j = 1 - i;flag[i]= true;  // 保证两个线程先后执行不死锁,实现相互排斥 victim = i;  // 保证两个线程同一时候执行时不死锁,实现相互排斥while(flag[j] && victim == i){}  // 相互排斥意味着等待}public void unlock(){int i = ThreadID.get();flag[i] = false;}}

Bakery锁支持n个线程的相互排斥协议。

通过数学证明了:

n线程的无死锁相互排斥算法须要n个不同的存储单元(变量)来保存中间状态。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

谈论高并发(三)锁的一些基本概念相关推荐

  1. 计算机网络利用率是什么_当我们在谈论高并发的时候究竟在谈什么?

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:hncghttp://segmentfault.com/a/119000001936 ...

  2. RedisSon高并发分布式锁实战RedisSon源码解读

    Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁,如果是分布式系统,跑在不 ...

  3. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  4. 从根上理解高性能、高并发(三):深入操作系统,彻底理解I/O多路复用

    本文原题"终于明白了,一文彻底理解I/O多路复用",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什 ...

  5. 高并发线程/锁/内存处理模型

    文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...

  6. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!

    来自:冰河技术 写在前面 最近,很多小伙伴留言说,在学习高并发编程时,不太明白分布式锁是用来解决什么问题的,还有不少小伙伴甚至连分布式锁是什么都不太明白.明明在生产环境上使用了自己开发的分布式锁,为什 ...

  7. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!

    点击上方蓝色"Garnett的Java之路",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 写在前面 最近,很多小伙伴留言说,在学习高并发编程时 ...

  8. 《并发与高并发系列第一集-基础与概念》

    面试官:看你简历上写,最近正在写并发编程方面的博客,是吧? 安琪拉:闲来无事,看看闲书,写写段子,承蒙读者厚爱,有此打算. 面试官:少跟我这拽文,"闲来无事"?阿里不用996吗? ...

  9. java 内存模型 多线程_Java 高并发三:Java内存模型和线程安全详解

    网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存.数据在主存中会有一份,在工作内存中也有一份.工作内存和主存之间会有各种原子操作去进行同步. 下图来源于这 ...

  10. mysql 高并发写入锁表_使用mysql中的锁解决高并发问题

    阿里云产品通用代金券,最高可领1888分享一波阿里云红包. 阿里云的购买入口 为什么要加锁 多核计算机的出现,计算机实现真正并行计算,可以在同一时刻,执行多个任务.在多线程编程中,因为线程执行顺序不可 ...

最新文章

  1. LeetCode.每日一题今日份_392.判断子序列
  2. 阿里云ECS上LVM磁盘配置
  3. ORB-SLAM介绍(无源码版本)
  4. springmvc为什么不能拦截jsp页面?
  5. [原创]软件测试工具简介及下载地址(不定时更新)
  6. 代码整洁之道(二)优雅注释之道
  7. 从文件中读取一个long型数_Python 从文件中读取数据
  8. java 中的匿名内部类
  9. java流程图平行四边形_流程图图形标准含义
  10. java 汉字拼音首字母_java获取汉字拼音首字母
  11. 雨林木风Ghost XP SP3 装机版 YN9.9 九月修正版 【雪豹】
  12. 【Mybatis学习路线】day01Mybatis概述
  13. 【LeetCode】求众数(四种方法)
  14. java itextPdf导出pdf
  15. 7 年 Python 的我,总结了这 90 条写 Python 程序的建议
  16. asp dotnet core 从零开始创建一个 WebApi 服务
  17. 支付宝支付(详细版)
  18. 1002内容预告:软件中国年度大盘点
  19. 百度、百事、大众、脸书、WeWork、领航等公司高管变动
  20. hdr_beg(host) hdr_reg(host) hdr_dom(host)

热门文章

  1. 【OpenCV学习笔记】【函数学习】四(origin+imageData+cvcopy()函数+CvMemStorage 类型+CvPoint类型)
  2. kpconv与point transformer异同、算法讲解
  3. 【python】opencv、PIL、gdal读取tif高分遥感影像比较
  4. Android透明状态栏或者渐变色状态栏
  5. 查找算法---------斐波那契查找
  6. 微服务与虚拟化技术博客总结
  7. Hibernate-逆向工程
  8. 凭实力蝉联第一!Flink 又双叒叕上榜啦
  9. 用python建立三元一次方程_python简单的三元一次方程求解实例
  10. 面试相关——计算机网络基础