Java中线程同步锁和互斥锁有啥区别看完你还是一脸懵逼详解编程语言
2023-06-13 09:20:30 时间
首先不要钻概念牛角尖,这样没意义。
也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的。无非就是哪种写起来方便而已。
锁就是锁而已,避免多个线程对同一个共享的数据并发修改带来的数据混乱。
锁要解决的大概就只有这4个问题:
“谁拿到了锁“这个信息存哪里(可以是当前class,当前instance的markword,还可以是某个具体的Lock的实例) 谁能抢到锁的规则(只能一个人抢到 Mutex;能抢有限多个数量 Semphore;自己可以反复抢 重入锁;读可以反复抢到但是写独占 读写锁……) 抢不到时怎么办(抢不到玩命抢;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着) 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢;按照一定规则通知某一个等待的线程;通知所有线程唤醒他们,让他们一起抢……)有了这些选择,你就可以按照业务需求组装出你需要锁。
关于“互斥”和“同步”的概念
答案很清楚了,互斥就是线程A访问了一组数据,线程BCD就不能同时访问这些数据,直到A停止访问了 同步就是ABCD这些线程要约定一个执行的协调顺序,比如D要执行,B和C必须都得做完,而B和C要开始,A必须先得昨晚。这是两种典型的并发问题。恰当的使用锁,可以解决同步或者互斥的问题。
你可以说Mutex是专门被设计来解决互斥的;Barrier,Semphore是专门来解决同步的。但是这些都离不开上述对上述4个问题的处理。同时,如果遇到了其他的具体的并发问题,你也可以定制一个锁来满足需要。
另外一个解释或许能明白更多
所谓互斥,就是不同线程通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写
同步关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用
总的来说,两者的区别就是:
互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。
相关文章
- Java设置全局变量_java如何定义全局变量
- Java进阶(二十三)java中long类型转换为int类型
- java怎么运行_怎样启动JAVA?「建议收藏」
- java平均的随机数_Java 随机数详解「建议收藏」
- java 唯一随机数_JAVA随机数
- java如何获取服务器路径
- java 自定义的类加载器_Java如何自定义类加载器[通俗易懂]
- java h2 数据库_Java H2数据库
- JAVA生成uuid_uuidJDK生成代码
- Java 线程池之Jetty 线程池学习总结
- Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架详解编程语言
- java 同步锁(synchronized)详解编程语言
- java JNI: C 语言调用 Java 方法示例详解编程语言
- java多线程有几种实现方法线程之间如何同步详解编程语言
- Java学习笔记之六java三种循环(for,while,do……while)的使用方法及区别详解编程语言
- Java学习笔记之四java进制转化详解编程语言
- Java学习笔记之一java关键字及作用详解编程语言
- 说下Java中的同步块详解编程语言
- java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println和System.err.println的区别 Java重定向System.out和System.err详解编程语言
- Java Collection或Map的同步详解编程语言
- java 线程之对象的同步和异步详解编程语言
- Java在Linux系统上的安装(java安装linux)
- Java同步的三种实现方式详解编程语言
- Java问题-java进程占用内存过高,排查原因详解编程语言
- Java与Oracle联手构建数据库新世界(java和oracle)
- 版本配置Linux系统的默认Java版本(linux默认java)
- Java编程实现MySQL表备份(java备份mysql表)
- Java操作Linux系统:让命令行更轻松(java操作linux)
- Java与Linux:前景迷人的新科技(java和linux前景)
- Java迭代Oracle实现数据库更高性能(java迭代oracle)