ok,闲话不说,上重要东西。。。
所有对象都含有单一的锁(也称监视器)。当在对象上调用其任意synchronized方法时候,此对象都加上锁,这时候该对象上的其他synchronized方法只有等到前一个方法调用完毕释放了锁之后才能被调用。对于前面的方法,如果某任务对对象调用了f(),对于同一个对象而言,就只能等到f()调用结束并释放了锁之后,其他任务才能调用f()和g().所以,对于某个特定的对象来说,其所有的synchronized方法共享同一个锁,这可以被用来防止多个任务同时访问被编码为对象内存。
一个任务可以多次获得对象的锁,如果一个方法在同一个对象上调用了第二个方法,后者又调用了同一对象上的另一个方法,就会发生这种情况。JVM负责跟踪对象被加锁的时候,计数变为1.每当这个相同的任务在这个对象上获得锁时,计数都会递增。显然,之后首先获得了锁的任务才能允许继续获取多个锁。每当任务离开一个synchroinized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。
针对每个类,也有一个锁(作为Class对象的一部分),所以synchronized static方法可以在类的方法内防止对static数据的并发访问。
有时,你只是希望防止多线程同时访问方法内部的部分代码而不是防止访问整个方法。通过这种方式分离出来的代码被称为临界区,它也使用synchronized关键字建立,这里,synchroized被用来制定某个对象
synchronized(syncObject){
}
这个被称为同步控制块 在进入此代码前,必须得到syncObject对象的锁。
说了这么多就两种锁 一个是对象的锁,一个是Class类的锁 但是Class类对象也是一个对象。所有的锁都能归结为对象锁。Class对象的锁 锁的是静态方法,而普通对象锁锁的是普通的。不论是类的锁还是方法的锁 需要用的时候 必须要获取它对象的锁。