线程的互斥与同步机制
同个人博客:http://tsundere-x.top/
一、互斥
为何需要引入互斥机制?
当多个线程对同一数据并发读写(至少有一个线程执行写操作)时,这种情形被称为竞争。竞争会导致数据读或写的不确定性。而有时这种不确定性是不可容忍的。
如何实现互斥?
在并发程序设计中,通常使用锁机制来实现互斥
1、由用户标记必须原子执行的代码段,即使用synchronized关键字
2、给资源一把配有自动机制的锁
【注意】:
Java将资源限定为引用型对象,并为每一对象自动配备一把锁:锁初始时处于打开状态。synchronized标记的原子代码段在访问资源前,会自动检测资源对象持有的锁是否处于打开状态。若是,则占用并同时将锁置为锁闭态,并在该代码段执行完毕后。将锁的状态值为打开态;若否,则持有该代码的线程因等待资源占用而进入阻塞态。
• 只有对象才有锁,对基本类型的数据,无法实现线程的互斥访问。
• 对于未使用synchronized标记的代码,锁机制不起作用。
• 无论正常结束还是异常退出,都将自动释放锁。
死锁和活锁
死锁:就是多个线程对临界资源的循环等待,使得这些线程均都无法获得执行。
例如:A,B,C三个线程分别占用D1、D2、D3三个临界资源,A只有获得B占用的资源D2,方能继续运行;而B只有获得C占用的资源D3,方能继续运行;C只有获得A占用的资源D1,方能继续运行。这样,A,B,C处在对资源的循环等待状态,均无法前进。
活锁:也称饥饿。就是某线程虽有执行的资格,但由于某种原因总是得不到执行。
例如:A,B,C三个线程循环访问临界资源D,但A,B的优先级相同,但均高于C。由于Java的抢占式策略,C线程可能总得不到执行。
二、同步
同步(Sync)
多个线程的运行满足特定的节奏
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。
简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步(Async)
多个线程的运行相互独立,彼此间无依赖性
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
举个例子简单说明下两者的区别:
同步:火车站多个窗口卖火车票,假设A窗口当卖第288张时,在这个短暂的过程中,其他窗口都不能卖这张票,也不能继续往下卖,必须这张票处理完其他窗口才能继续卖票。直白点说就是当你看见程序里出现synchronized这个关键字,将任务锁起来,当某个线程进来时,不能让其他线程继续进来,那就代表是同步了。
异步:当我们用手机下载某个视频时,我们大多数人都不会一直等着这个视频下载完,而是在下载的过程看看手机里的其他东西,比如用qq或者是微信聊聊天,这种的就是异步,你执行你的,我执行我的,互不干扰。比如上面卖火车票,如果多个窗口之间互不影响,我行我素,A窗口卖到第288张了,B窗口不管A窗口,自己也卖第288张票,那显然会出错了。
并发
在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。
并行
在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事 件之间不一定要同一时刻发生。
Java的同步机制 = 存取共享资源的互斥机制 + 线程间的通信机制
用于线程通信的方法存在于Object类中,包括wait()、notify()、notifyAll()。wait()会暂停当前线程的执行,并释放所持有的锁,进入等待状态;notify()操作将唤醒一个等待的线程;notifyAll()将唤醒所有等待的进程。
【注意】
wait()、notify()、notifyAll()都是final方法,不允许被重写;这些方法只能直接或间接地用于临界区中,否则,将会产生非法监控锁状态异常。
线程的互斥与同步机制相关推荐
- BCB线程的互斥与同步
线程的互斥与同步 互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突.实现线程互斥的方法有: (1) 访问代码委托给VCL主线程执行.在线程中若要调用可视化的方法或访问 ...
- 南京邮电大学操作系统实验二:线程的互斥与同步
实验原理及内容 基于互斥锁的临界区管理 使用编辑器gedit 2_1.c,新建一个2_1.c源文件,创建双线程并发完成订票操作,输入后面的范例代码: #include <stdio.h> ...
- 线程同步机制synchronized中锁的判断以及锁的作用范围
当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...
- java线程同步机制有哪些_多线程同步机制包括哪些,java线程同步机制
多线程同步机制包括哪些什么是多线程同步机制,多线程同步机制包括:1.临界段用于实现"独占占有":2.信号量用于跟踪有限的资源:3.互斥是核心对象,可以实现不同线程之间的" ...
- java线程同步机制有哪些_多线程同步机制包括哪些
多线程同步机制包括:1.Critical Section用来实现"排他性占有":2.Semaphore被用来追踪有限的资源:3.Mutex是核心对象,可以在不同的线程之间实现&qu ...
- 使用同步机制解决线程安全问题
线程的生命周期: 什么情况会产生线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,即产生线程安全问题.读的操作不会发生线程安全问题. 例子:上文中的卖票 ...
- java 线程之对象的同步和异步
一.多线程环境下的同步与异步 同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去. package com.jalja.org.th ...
- 多线程同步机制的几种方法
Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程 的各线程之间.它是: 一个局部性对象,不是一个核心对象. ...
- c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...
线程同步机制:POSIX 信号量,互斥量,条件变量 POSIX 信号量 常用的POSIX 信号量函数为如下5个: sem_init sem_destroy sem_wait sem_trywait s ...
最新文章
- OpenCV 4.5.2 发布
- 《2020雇佣关系趋势报告》今发布:近三成受访者兼职,近七成工作量增加、考核变严格
- HTTP的 Basic 验证
- delphi Tpagecontrol 动态增加页面
- echo count(“abc”); 输出什么?
- [Swift通天遁地]五、高级扩展-(4)快速生成Invert、Mix、Tint、Shade颜色及调整饱和度阶...
- 服务器开机忘记密码怎么修改,服务器忘记mysql密码怎么修改?
- 持续集成部署Jenkins工作笔记0013---配置远程触发构建的TOKEN值
- 如何安装mavaen_Maven的安装及配置
- 汇编笔记1:debug
- c语言二叉树链式存储,C语言 二叉树的链式存储实例
- 机虚拟磁盘附加到计算机上,Hyper-V 怎样拷贝文件至虚拟硬盘并附加到虚拟机上...
- 简述基于软件体系结构的软件开发过程
- 电工电子技术实训QY-DQJ07
- 5000张高清壁纸大图(手机用),用Python在法律的边缘又试探了一把
- ultravnc中文版,5步教你如何进行ultravnc中文版配置
- 单片机c语言延时程序计算,单片机 计算延时子程序执行时间
- U68464 滑稽树上滑稽果(guo)
- HDU-5238 Calculator
- mysql 获取农历年份_iOS 获取公历、农历日期的年月日
热门文章
- LeetCode 418. 屏幕可显示句子的数量(DP)*
- LintCode 1652. 区间异或 II
- K 近邻法(K-Nearest Neighbor, K-NN)
- 程序员面试金典 - 面试题 02.01. 移除重复节点(哈希set)
- 【机器学习-数据科学】第二节:ipython开发环境搭建以及pandas快速入门
- 【Python基础知识-pycharm版】第七节-函数
- 高效程序员的 7 项技能
- Python面试常用二十题总结
- 谈谈工业界落地能力最强的机器学习算法
- 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习