前言
在多线程环境下,如果多个线程同时对某个数据进行修改,则可能会出现不可预料的结果。为了保证数据被正确修改,就需要对多个线程进行同步。
Rlock方法
使用 Thread 对象的 Lock 和 RLock 可以实现简单的线程同步。Lock 对象和 RLock 对象都具有acquire 方法和 release 方法。如果某个数据在某一时刻只允许一个线程进行操作,则可以将操作过程放在 acquire 方法和 release 方法之间。
无同步多线程演示
思路:定义一个全局变量,创建10个线程,每个线程对此全局变量加2,线程休眠2秒,之后各自打印修改后的值。
演示代码
运行结果
结果分析
代码运行结果显示每个线程打印全局变量的值都是最终修改后的值,这不是我们所想要的结果,所以就出现了线程之间非同步,这个非同步其实是由线程休眠2秒导致的,在一个线程休眠期间,系统启动另外一个线程对全局变量增加了2,(这里的2秒模拟了该线程占用此变量执行任务的时间)当所有线程都启动后,第一个线程还没有唤醒,这时候全局变量早就变为了20当所有线程依次醒来,打印的值就是全局变量的最终值。那如果我们需要每个线程改变变量后就输出其更改的值应该怎么办呢,可以参考下文的方法。
多线程同步演示
思路:还是使用上文的代码,再对每个线程使用RLock方法,通过结果验证。RLock方法可以理解为线程锁定,当线程锁定运行时,公共的资源由该线程独用,阻塞其他进程。
演示脚本:
代码改动位置加注了特别标记,共修改了2处,要特别注意,锁请求acquire和锁释放release必须成对出现。
运行结果:
结果分析:
从代码的运行结果我们可以看出代码运行的过程正是我们预期的,实现了线程的同步。但在运行代码的时候,你会清楚地感觉到脚本的运行时间明显加长了,大概是20秒,之前的代码运行时间大概时2秒。
通过运行的时间我们也可以看出,RLock的方法阻止了多线程的并发运行,锁包含的代码只能以单线程模式运行,所以大大降低了运行效率,所以在执行时间较长的任务时,最好不要使用锁。
结语
RLock是一把双刃剑,虽然确保了代码的完整运行和资源正确,但也会阻止线程并发,降低代码的运行效率,所以在使用时要根据代码的特点合理正确的使用该方法。
需要源码的同学可以私信我索取哦。
*************************************
如果感觉本文有趣或者对你有帮助,可以收藏或转发哦。
关注【趣知苑】获取更多有趣实用的好文章。
趣知苑,有趣的知识荟萃,只做原创分享
举报/反馈

玩转嵌入式

178获赞 21粉丝
5年嵌入式系统架构师,分析师爱好写作和分享定期分享专业知识技能,剖析行业动态我的故事不是你的未来,但一定能对你有所启发
关注
0
0
收藏
分享