IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java 中线程同步锁和互斥锁 -> 正文阅读

[Java知识库]Java 中线程同步锁和互斥锁

一 概述

1.1 互斥

所谓互斥,就是不同线程,通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写。

1.2 同步

同步关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时,对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用。

1.3 两者区别

总的来说,两者的区别就是:互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。

二 总结

纠结到底是同步锁还是互斥锁其实是没有什么意义的,你可以认为它们就属于一个东西,如果你只是抠这些概念的话,很容易陷入在一个"活锁"中,出也出不来。

在 Java 中,互斥锁就是两种,synchronized 和 Lock 接口的 xxxLock 实现类。但是道理都是一样的。无非就是哪种写起来更方便。

锁的目的就是避免多个线程对同一个共享的数据并发修改带来的数据混乱。如果存在线程安全性问题,一个非常有效的方式就是加锁,这里的同步锁和互斥锁其实就是一个意思。

锁在操作系统层面的意思就是 Mutex,互斥,意思就是说我(某个线程)获取锁(进入临界区)之后,其他线程不能再进入临界区,这样就达到了互斥的目的,如下图所示。
在这里插入图片描述
锁的实现要处理的大概就只有以下4类问题:

  • “谁拿到了锁“,这个信息存哪里(可以是当前 class,当前 instance 的 markword,也可以是某个具体的 Lock 的实例)
  • 谁能抢到锁的规则(只能一个人抢到 - Mutex;能抢有限多个数量 - Semaphore;自己可以反复抢 - 重入锁;读可以反复抢到但是写独占 - 读写锁……)
  • 抢不到时怎么办(抢不到玩命抢;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着)
  • 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢;按照一定规则通知某一个等待的线程;通知所有线程唤醒他们,让他们一起抢……)

有了这些选择,你就可以按照业务需求组装出你需要锁。

  • 互斥就是线程 A 访问了一组数据,线程 BCD 就不能同时访问这些数据,直到 A 停止访问了
  • 同步就是 ABCD 这些线程要约定一个执行的协调顺序。比如 D 要执行,B 和 C 必须都得做完,而 B 和 C 要开始,A 必须先得做完

这是两种典型的并发问题。恰当的使用锁,可以解决同步或者互斥的问题。

你可以说 Mutex 是专门被设计来解决互斥的;Barrier,Semaphore 是专门来解决同步的。但是这些都离不开上述对上述4个问题的处理。同时,如果遇到了其他的具体的并发问题,你也可以定制一个锁来满足需要。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:44:09  更:2021-08-27 11:44:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:39:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码