1.ReentrantLock是可重入锁,锁定的是线程,即使不同对象加锁,只要线程没有改变,就一直持有锁;
比如有一个启动方法调用:
A.XX()
{
lock.lock();
B.XX()//假设B对象里面也使用此lock做了一次加锁和解锁;
C.XX()//假设C对象里面也使用此lock做了一次加锁和解锁;
lock.unlock();
}
--在此例子中,如果使用synchronized锁定对象B和C,则如果对象B退出synchronized区域时,此时B对象的锁
可能被其他线程获取(比如其他方法调用了关闭),则此启动线程就无法正常启动了;
2.synchronized:锁定具体对象或者类,和线程无关,属于一种简易的锁;
所以同一对象中的synchronized关键字有以下几种情况:
1)synchronized(this)和synchronized XX()非静态方法会互斥;//属于同一对象
2)synchronized(this)和synchronized (otherObj)不会互斥;//属于不同对象
3)synchronized(otherObj1)和synchronized (otherObj2)不会互斥;//属于不同对象;
4)synchronized(this)和synchronized static XX()静态方法不会互斥;//属于不同对象,一个属于this,一个属于Class对象;