lock总结

本文对比分析了Java中synchronized关键字与Lock接口的区别,以及C#中lock语句的使用方式与锁对象的选择,强调了锁的具体作用及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

suoc#和java之间的锁关系理清一下

正式工作也已经有9个月了,算上实习有3年了,可以很明确的说,编程语言是互通的,但是不要搞混了,搞混就需要好好理清弄清楚,否则会造成很严重的后果。

 

一开始我写java程序的时候,在多线程应用之中,用的是synchronized 用来锁公共资源。当一个线程获取了对应的锁,并执行该代码块的时候,其他线程只能一直等待,等待获取锁的线程释放锁,而释放只会有两种情况:1、获取锁的县城执行完该段代码,然后线程释放对锁的占有,2、线程执行发生异常,此时jvm会让线程自动释放锁。

但是现在引入了,或者说最近我才看到了java.util.concurrent.locks这个包,有一个lock关键词。但是要注意synchronized执行完,系统会自动让线程释放对锁的占用;而lock则必须要用户去手动释放锁,没释放就有可能出现死锁的情况了

 

现在来讲一下c#吧,现在的工作主要集中于c#方面,锁的概念殊途同归

lock(){

       ………………

       ………………

}

锁到底在锁什么

一开始我也以为这个锁,锁的是对象,锁的是变量~~~~~~~其实错啦

你经常会看到

lock(1){  ……}

这类莫名奇妙的代码,这个到底在锁什么呢?

好吧,其实锁的是唯一标识码,你可以理解为guid/uuid这类的东西

也就是说,你在不同线程都使用lock(1)的时候会出现同步/互斥,其实我们的对象都是一个引用,new出来一个新的实例对象以后,他在内存里面有一个对应的地址,对象指向那个地址,那么你就可以理解了 lock(1)就是锁的目标 1的地址,在.net里面有些机制,相同值变量指向的是同一个东西。那么就有人会问,为啥不用guid之类的,答案是开销有点大,还不如用已经生成的东西弄出来搞

上面可能还没讲清楚 lock(#){*},锁的不是#关键词,而是*的代码段,当关键词一样的时候,才会相互锁起来

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值