一 概述

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 中线程同步锁和互斥锁相关推荐

  1. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  2. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  3. python中的 同步与异步 互斥锁 和 死锁

    同步与异步: 同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去. 异步:指进程不需要一直等下去,而是继续执行下面的操 ...

  4. Java中线程同步锁和互斥锁有啥区别?看完你还是一脸懵逼?

    首先不要钻概念牛角尖,这样没意义. 也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的.无非就是哪种写起来方便而已. 锁就是锁而已,避免多个线程对同一个 ...

  5. JAVA中线程同步的方法

    1.wait方法. 2.notify方法和notifyAll方法. 3.synchronized关键字.

  6. java 同步锁_java线程中的同步锁和互斥锁有什么区别?

    在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...

  7. Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法

    栗子来源:https://blog.csdn.net/wenzhi20102321/article/details/52524545 首先对java中同步锁与互斥锁进行区分,主要来源于知乎中的大佬总结 ...

  8. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

  9. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

最新文章

  1. 抽象工厂模式java_Java之抽象工厂模式(Abstract Factory)
  2. python turtle库画椭圆_如何用Python画一只肥肥的柯基狗狗——turtle库绘制椭圆与弧线实践...
  3. linux c 服务程序,Linux C 后台服务程序单进程控制
  4. 掌控谈话~让对方说“你说得对
  5. 中by的用法_经常混淆的介词at、on、in、by用法细讲,收藏学习
  6. SQL数据表字段类型与属性总结(DDL)
  7. python——pandas库之DataFrame数据结构基础
  8. 一个老鸟眼中“IT民工”的发展方向
  9. 初探asp.net异步编程之await
  10. Bootstrap tab页签刷新加载不显示,只有点击其他标签后第一个才显示
  11. IP地址与数字地址相互转换
  12. 388.文件的最长绝对路径
  13. Multisim12使用记录
  14. 思源黑体对应font-weight
  15. tpac100控制器设置教程_AC100基站控制器配置说明
  16. 微信小程序中音频播放
  17. wps怎么画网络图_wps 流程图怎么画 WPS流程图绘制图解教程
  18. Win7多用户下开机只显示一个用户
  19. android开发中如何判断手机中存在的sim卡数量?
  20. 2-6_Cleaning_Data

热门文章

  1. 画好高中男生校服有哪些技巧?
  2. CSDN学霸课表——微信公众号开发全部流程
  3. 如何使用手机拍出证件照?简单几步教你轻松完成
  4. 耳机不分主从是什么意思_真无线蓝牙耳机为什么可以不分主副?哪款蓝牙耳机性价比高?...
  5. 印象笔记导出HTML再转markdown的方法
  6. 考研英语 - word-list-24
  7. 从大数据看2018世界杯—冷门迭爆,你热爱的球队回家了吗?
  8. 【发布】App Store 预览视频制作总结
  9. 城南170万高性价比叠拼,上车机会不多了!
  10. Cadence Allegro如何增加或删除标注尺寸?