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(#){*},锁的不是#关键词,而是*的代码段,当关键词一样的时候,才会相互锁起来