互斥锁经典例子

无意发现小伙伴群(一群攻城狮)里面讨论了一个互斥锁使用的经典例子,自己也研究一下。


互斥锁经典例子_第1张图片
代码
互斥锁经典例子_第2张图片
输出结果

很明显可以看出,method1和method2执行相差10s(此处部分同学疑问为什么不是12s),method2和method3执行相差3s

@synchronized(obj){
}

obj被加锁,当下次调用@synchronized(obj)时判断当前obj是否是锁定状态,如果非锁定,及执行内部方法,并对obj加锁,执行完内部方法后解锁。

所以method1执行10s之后才释放了self,对于为什么不是12s,这个跟并行线程队列有关,当两个任务异步加在同一个并行线程队列后,可以认为是在同时执行,method1后面的sleep(10)中,sleep(2)也并行在执行。本质他们分别由不同的线程执行,所以相差10s。


互斥锁经典例子_第3张图片
执行sleep(2)的线程
互斥锁经典例子_第4张图片
执行sleep(10)的线程

总结:
1、@synchronized(obj){}:时判断当前obj是否是锁定状态,如果非锁定,及执行内部方法,并对obj加锁,执行完内部方法后解锁。
2、异步添加多个任务到并行线程队列,这些任务分别由不同的线程执行。

你可能感兴趣的