1: synchronized 加锁 是 加在了 真正引用的对象上, 注意:是对象上。
对变量1 加锁 实际上就是 对object1 加锁
obj----->
如果 加锁后,改变 变量1 的指向。再对变量1加锁时,加的是object 2 对象的 锁。
如下示例: 两个线程 虽然都是对 lock 加锁,由于 lock 前后指向的对象变了。。所以实际上加的不是同一个锁,所以二者不会构成 互斥执行。
public class testSys {
Object lock=new Object();
public static void main(String a[]){
final testSys abc=new testSys();
new Thread(){
public void run(){
System.out.println("start1.........");
synchronized(abc.lock){
abc.lock=new Object(); ---------------------这一行导致运行结果是不同的。
try {
Thread.sleep(10000);
System.out.println("over");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new Thread(){
public void run(){
System.out.println("start2.........");
//Object abcd=abc.lock;
synchronized(abc.lock){
try {
Thread.sleep(1);
System.out.println("over1111111");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}