基本概念简述

多个线程同时访问一个共享数据,很可能造成恶劣的后果;为了保证数据访问资源的正确性和安全性,需要对线程进行"同步"
(Linux下所有的执行实体都称为任务(task),每个任务类似于单线程的进程,共享了同一个内存空间的多个任务构成了一个进程)
 

  • 同步
    指在一个线程对数据访问未结束的时候,其他线程不得访问同一个数据,将对数据的访问原子化
     
  • 原子操作
    不可分割,不会被线程调度打断的操作
    (一个程序在运行的过程中可能被优先级更高的线程中断,而有些操作是不可中断的,不然会出现无法还原的后果,这时候操作系统就需要原子操作)

线程同步

同步最常用的方式"锁",每一个线程访问数据或资源前首先要获取锁,并在访问结束后释放锁;在锁被占用时试图获取锁,线程会进入等待,直到锁重新可用
二元信号量是最简单的一种锁,适合被一个线程独占访问的资源。它只有两种状态,占用和非占用;当一个线程获取锁后,其他线程试图获取锁将进入等待,直到该锁被释放。
 
互斥量类似于二元信号量,资源同时只允许一个线程访问,不同的是信号量在整个系统中允许任何线程获取并释放,即信号量可以被系统中一个线程获取,然后由另一个线程释放它;而互斥锁要求哪个线程获取互斥量,这个线程就要负责释放这个锁,其他线程释放该互斥量是无效的

  • 临界资源
    一次仅允许一个进程访问的资源称为临界资源,通常用互斥量控制临界资源的访问
     

P(测试)/ V(增加)操作

对于允许多个线程并发访问的锁成为多元信号量,简称信号量,一个初始值为N的信号量允许N个线程同时访问,线程访问资源首先获取信号量,进行如下操作(P):

  1. 将信号量的值减 1
  2. 如果信号量的值小于 0,则进入等待

 
访问完资源后,线程释放信号量,进行如下操作(V):

  1. 将信号量的值加 1
  2. 如果信号量的值小于 1,唤醒一个等待中的线程
     

最新文章

  1. jquery mobile开发中footer一直在底部的设置方法
  2. day4总结
  3. android接入微信分享(朋友、朋友圈)、QQ分享(好友、空间)
  4. Spring 使用中的设计模式
  5. 服务器之间socket传输单链接和多连接测试结果
  6. 你需要知道的九大排序算法【Python实现】之归并排序
  7. Ubuntu 12.04 搭建 Eclipse Android 开发环境(转)
  8. 洛谷 [P3258] 松鼠的新家
  9. linux 50个常用命令
  10. java中hashCode()与equals()详解
  11. 利用jmap和MAT等工具查看JVM运行时堆内存
  12. Pocket Gems面经prepare: Diamond and Ruby
  13. go语言语法基础
  14. hash 在 perl 中的用法(转载)
  15. Java gc中的那些事
  16. RobotFramework测试问题二:各种元素不能定位问题
  17. ie请求缓存问题,页面内容没有及时更新
  18. uvalive 3415 Guardian Of Decency
  19. 背水一战 Windows 10 (49) - 控件(集合类): Pivot, Hub
  20. IDEA 之 Error during artifact deployment. See server log for details

热门文章

  1. Java多线程编程(七)线程状态、线程组与异常处理
  2. Flask解析(二):Flask-Sqlalchemy与多线程、多进程
  3. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(下)
  4. vue页面首次加载缓慢原因及解决方案
  5. 重新认识MySQL中的COUNT语句
  6. SQLserver2016对字段是json对象查询
  7. java常用类Time
  8. 学习c++11 ThreadPool【转】
  9. 安装实时查看日志工具 log.io
  10. cdq分治 陌上花开(内无题解)