无意发现小伙伴群(一群攻城狮)里面讨论了一个互斥锁使用的经典例子,自己也研究一下。
代码输出结果
很明显可以看出,method1和method2执行相差10s(此处部分同学疑问为什么不是12s),method2和method3执行相差3s
@synchronized(obj){
}
obj被加锁,当下次调用@synchronized(obj)时判断当前obj是否是锁定状态,如果非锁定,及执行内部方法,并对obj加锁,执行完内部方法后解锁。
所以method1执行10s之后才释放了self,对于为什么不是12s,这个跟并行线程队列有关,当两个任务异步加在同一个并行线程队列后,可以认为是在同时执行,method1后面的sleep(10)中,sleep(2)也并行在执行。本质他们分别由不同的线程执行,所以相差10s。
执行sleep(2)的线程执行sleep(10)的线程
总结:
1、@synchronized(obj){}:时判断当前obj是否是锁定状态,如果非锁定,及执行内部方法,并对obj加锁,执行完内部方法后解锁。
2、异步添加多个任务到并行线程队列,这些任务分别由不同的线程执行。
网友评论