编程技术中很多看似简单的概念其实大多都大有可挖或是容易忽略的部分,这些容易让人忽略的其实更重。学习多线程,大家总是说锁怎么样,怎么样,加什么锁,什么时候加,什么时候释放,那么大家有没有想过锁锁住的是哪些东西
我们知道 synchronized、ReentrantLock 这些锁手段,synchronized 使用的是对象锁,类锁,ReentrantLock 本身就是锁,绝大部分资料都是说的是锁,大家想没想过, synchronized、ReentrantLock 锁住的是谁?其实答案很简单,本质上锁锁住的资源,使用上锁锁住的是一段代码,我们平时写的就是代码,所以锁锁住的其实就是代码本身,至少在表现上就是这样的
上厕所 - 这我们都熟悉无比了吧,公共场所的厕所一般坑位都有限,前面的进去了上了锁,我们后来的就只能排队等着,得排好队伍紧盯坑位,要不肯定有加塞的。大家不觉得这和我们学习的多线程其实一模一样吗?锁锁上的是门,而我们开不开门就进不去坑位,坑位好比锁锁住的资源,而坑位所在的房子就好比是坑位所在的那段代码,因为坑位加了锁,就相当坑位的房子我们进不去,所以锁在日常使用上的表现就是锁住了这段代码
// 1. synchornized 锁住的是 someMethod 这个方法里的代码,除了自己,任何人想用这个方法的代码都会被阻塞
public synchornized someMethod(){
...
}
// 2. synchronized 锁住的是里面的代码,锁可以不同,但是锁住的不会变
synchronized(不同的锁对象){
...
}
// 3. ReentrantLock 本身就是锁,锁主的是 increase 这个方法的代码
lock.lock();
increase();
lock.unlock();
网友评论