1.每个对象都有一把锁,这个锁(对象)又有属于它的两个池,锁池(Entry Set)和等待池(Wait Set)。
2.锁池中的线程都在等待对象锁解锁而被jvm调出运行。等待池中的线程都在等待被调度到锁池。
3.锁池的线程都在竞争,由jvm决定最终调度哪个线程。等待池的线程,可被对象的notify()、notifyAll(),或自己wait()时有设定最大等待时间,而被jvm移入锁池,因此程序设计不合理可导致线程无限等待。
4.wait(),notify(),notifyAll() 方法都必须在synchronized代码中被调用。
5.遇到synchronized时,若锁是开着的,则锁上,线程继续运行;若锁是关着的,线程进入锁池。
6.调用wait()后,解锁对象锁,线程进入等待池。从等待池最终又回到运行状态时,接着执行wait()后面的代码。
7.synchronized(object){}
,object可以是任意对象。
当synchronized不用在代码段,而是用在函数定义中时:
public synchronized void m1(){}
,等同与方法内用synchronized(this){}
包围全部代码。
public static synchronized void m1(){}
,等同与方法内用synchronized(this.getClass()){}
包围全部代码。
网友评论