众所周知,Java的同步方法或者同步块即锁的机制,目的是使用sychronized方法或者sychronized块时,当一个线程进入sychronized区域时,其他线程不可能再进入;一旦前一个线程离开sychronized区域,其他线程即可以进入(无需前一个释放锁的线程来唤醒它们)! 具体的实现机制可能有两种:
第一种,当一个线程进入sychronized区域时,其他试图进入的线程均被阻塞,当前者离开时,其他线程均被系统唤醒,然后去竞争锁。
第二种,当一个线程进入sychronized区域时,其他试图进入的线程均被不能进入,但是它们并未真正阻塞,而是不断测试锁而不得,当前者离开时,它们之中一个即获得锁。
显然,这两种机制效果是等同的,对于程序员来说,不必关心究竟Java虚拟机用的是哪一个。当然,第一种机制更合理、高效,因为得不到锁的线程可以不再进入调度队列,从而不必占据CPU时间。很可能Java虚拟机使用的就是第一种机制——目前在我文献中还没有查确切的结论,请懂行的网友谈谈。
第一种,当一个线程进入sychronized区域时,其他试图进入的线程均被阻塞,当前者离开时,其他线程均被系统唤醒,然后去竞争锁。
第二种,当一个线程进入sychronized区域时,其他试图进入的线程均被不能进入,但是它们并未真正阻塞,而是不断测试锁而不得,当前者离开时,它们之中一个即获得锁。
显然,这两种机制效果是等同的,对于程序员来说,不必关心究竟Java虚拟机用的是哪一个。当然,第一种机制更合理、高效,因为得不到锁的线程可以不再进入调度队列,从而不必占据CPU时间。很可能Java虚拟机使用的就是第一种机制——目前在我文献中还没有查确切的结论,请懂行的网友谈谈。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货