无论是互斥量、信号量、对象锁、线程锁、进程锁等等,简略的说他们都一样,都是把某种东西锁住(抽象了),可能他们的级别不一样、使用的位置不一样。
对于我使用过的语言,包括c++、java、python、c,语言体系不一样,但使用锁的思考可能殊途同归。
c++/c:
在多线程、多进程情况下,我会首先思考当前使用的对象/指针/方法,无论管它叫什么都好。它会在哪里(进程空间的位置),要去哪里,去了干什么,亦或哪都不去只是处理一些数据?
答案可能是在栈上,或者在堆上,亦或静态区全局区。在栈上的话,情形比较简单,但是必须确定在栈上的是这个对象的所有内容而不是一个地址!在c++中,思考这个问题似乎也有些乱花渐欲迷人眼。有些时候类的层级复杂了变量多了,很容易忘记某个对象在哪里。其实写多了就会发现这并不复杂,只要找到这个对象最开始创建的位置问题便迎刃而解。
但是对于初学者或者经验不多的人来说,找到对象最开始创建的位置似乎也并不那么容易。由此看出,c++真的是一门需要多写多多的写才能秀出自我的语言。
回归正题,如果当前正在使用的东西在栈(无论哪个线程栈)上,那么它便不必考虑安全问题(是否加锁)。反之,只要它不在栈上,它便是危险的!危险的便值得加锁,如果有足够的自信认为不会有竞争(通常这种自信都是错的),那也大可随意处置。
java:
java的情形比较简单,new出来的必然在堆上,只要在堆上不同的访问者必然导致危险。不用new的必然在栈上(string另当别论),它们必然是顺序执行的,谈不到危不危险的话题。
python:
python好用是好用了,但效率成问题,实测和c++的速度比慢的不是一点半点(成倍的差距),好在大部分业务并不很注重效率。然而python我也是刚刚用,还说不出个所以然来,全是凭感觉加锁。。。