【同步-专栏系列】2.利用互斥锁解决原子性问题

本文探讨了在并发编程中如何利用互斥锁解决原子性问题。从原子性的概念出发,分析了在多核CPU环境下确保线程互斥的重要性。通过介绍简易锁模型和改进后的锁模型,阐述了锁与受保护资源的关系。Java中的`synchronized`关键字作为实现锁的手段,其内部隐式进行了加锁和解锁操作,并详细解析了它在修饰非静态和静态方法时的锁对象。最后强调了一把锁应保护多个资源的正确关系,避免并发问题的发生。
摘要由CSDN通过智能技术生成

原子性的定义:一个或多个操作在CPU的执行过程中,不被中断的特性叫做原子性。
我们知道引起原子性问题的原因是“线程切换”。所以如果能够禁止线程切换就解决问题了?而操作系统是依赖CPU中断做线程切换的,那么我们禁用CPU中断不就行了吗?
在单核CPU的环境下,这个答案是可行的。但是现在是多核CPU时代。在多核CPU场景下,假如同一时刻有两个线程在运行,一个线程执行在CPU-1上,一个执行在CPU-2上。那么禁止中断,只能保证线程在CPU上的连续执行,并不能保证同一个时刻只有一个线程在执行。

“同一时刻只有一个线程在执行”,这个条件非常重要,我们称之为“互斥”。如果我们能保证对共享变量的修改是互斥的,那么无论是单核CPU或者是多核CPU就能保证原子性了。
实现互斥,最容易想到就是锁。

1.简易锁模型

在这里插入图片描述
我们将一段需要互斥执行的代码称为临界区。在进入临界区之前,首先尝试加锁lock,如果加锁成功进入临界区,我们称这个线程持有了锁。否则就等待持有锁的线程释放锁;持有锁的线程执行完临界区的代码之后,释放锁unLock。
现在还有进一步的问题,我们锁的是什么,保护的又是什么?

2.改进之后的锁模型

在这里插入图片描述
解释下上图:我们把临界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值