以前有个误区,A对象中的一个synchroized(target)方法块,我以为获得的都是A对象的锁(无论target是写的什么对象)。
正确的应该是获得的锁应该是target对象的锁,和A对象没什么毛线关系。只有2种情况才是获得A对象锁,synchroized(this)和synchroized修饰在改对象的非静态方法前。
下面这段代码,2个线程,进入同一个对象,一个线程运行count1 ,一个线程运行count2,count1的加锁对象是o,count2的加锁对象是t,因此,当一个线程进入对象调用count1的时候,另一个对象是能够调用count2的,因为他们锁的是2个不同对象。
public class DifferentLock {
Object o = new Object();
Object t = new Object();
public void count1() {
synchronized (o) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("count1");
}
}
public void count2() {
synchronized (t) {
System.out.println("count2");
}
}
public static void main(String[] args)
{
DifferentLock p = new DifferentLock();
Thread t1 = new Thread(new TestThread(p));
t1.start();
Thread t2 = new Thread(new TestThread2(p));
t2.start();
}
}
class TestThread implements Runnable {
DifferentLock o;
public TestThread(DifferentLock o)
{
this.o = o;
}
@Override
public void run() {
o.count1();
}
}
class TestThread2 implements Runnable {
DifferentLock o;
public TestThread2(DifferentLock o)
{
this.o = o;
}
@Override
public void run() {
while(true)
{
o.count2();
}
}
}
我认识到这个是因为看了这篇文章:
http://buaawhl.iteye.com/blog/1160400