重新认识 java synchronized 加锁

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();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值