多线程在任何语言中都有介绍,多线程共享一份资源,因此要操作一个变量时,必须为变量加上一个锁,虽然这样影响了效率,只能一个线程来操作该变量,其他线程只能等到该线程释放锁后,获得锁,才能操作变量。在python里面有threading.Lock()来生成锁,利用acquire(),release(),来释放锁,java中利用关键字synchronized来锁住变量.
1.锁住方法
调用如下:
两个线程t1,t2都同时调用了a对象的run方法,但是run方法上了锁,所有同一时刻只能被一个线程调用,运行如下:
t1先获得锁,完成后释放锁,再被t2获得锁,调用run方法,但是如果改成如下,结果会怎么样呢?
t1和t2分别调用了不同对象的run方法,虽然run方法都上了锁,但是各个对象都只有一个线程竞争资源,所有两个线程或不干扰,各自运行
没有达到我们上锁的目的,因此得出结论,被锁定的方法只能有一份拷贝,需要多个线程竞争。
2.锁变量
锁定变量的格式如下:
synchronized(被锁定的变量){
操作。。。。
}
调用如下
运行:
锁定的是当前对象this,就是我们传入的对象a,因为只有一个a,所有t2需要等待t1释放锁后才能调用syncronized中的操作,如果我们改成这样
那又又两个对象了,和上面一样,只有一个线程竞争,所以不用等待,运行如下:
各自运行,各不相干。
总结:被锁住的只能有一份,需要多个线程来抢才能发挥锁的作用,如果是静态方法,锁不锁都可以,因为只有一份拷贝。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架