一 概述

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. 【硬核技能】舒工自创bind绑定数据方法,类似angular和vue绑定数据原理
  2. GPRS流量计算方法(TCP/IP)
  3. 玩了十年的射击游戏都是有情怀的,大家都是热爱CFHD的一代
  4. 16进制数组转字符串
  5. 将Centos的yum源更换为阿里云源
  6. 【LeetCode】剑指 Offer 10- I. 斐波那契数列
  7. python queue 生产者 消费者_生产者、消费者模型---Queue类
  8. Ubuntu下很给力的下载工具
  9. HCIE Security AC访客管理和终端安全 备考笔记(幕布)
  10. SQL删除字段重复内容且保留唯一一条数据
  11. 仿城通网盘仿蓝奏网盘源码
  12. hihoder 1048
  13. VS2005中UNICODE和ANSI以及MBCS的问题
  14. Leco题目:两数相加
  15. 券商如何做好机构服务
  16. Java并发编程总结
  17. 法律纠纷信息检索(爬虫)
  18. MTK6573智能机平台系统文件夹文件详解3 - App目录
  19. 永磁同步电机矢量控制中的双闭环是什么意思_【百问百答】ST 电机控制实战问答合辑 | 连载之二...
  20. windows解密bitlocker【2】密码读取

热门文章

  1. java mysql重要吗_干了三年的Java,你竟然还不会MySQL性能优化
  2. easyExcel自定义表头导出
  3. python canvas画弧度_Python带你找回童年的万花尺
  4. android app 启动第一个页面
  5. 找工作学历重要还是经验重要?巴菲特:看简历的时候,我从来不看他从哪个学校毕业的...
  6. C语言宏定义和宏定义函数
  7. 画册设计如何紧随当代的潮流
  8. 小米使用计算机计算sin30,小米手机计算器sin30度怎么不等于0?
  9. C/C++语言经典、实用、趣味程序设计编程百例精解(3)
  10. 什么是备忘录?备忘录怎么扫描转文字?