Synchronize
对象锁改变
当对一个对象加锁时
如果,对象本身发生改变,那么,持有的锁就不同了
如果,对象本身不改变,那么,依然是同步的
package com.bjsxt.base.sync006;
/**
* 锁对象的改变问题
*
*/
public class ChangeLock {
private String lock = "lock";
private void method() {
synchronized (lock) {
try {
System.out.println("当前线程 : " + Thread.currentThread().getName() + "开始");
lock = "change lock";
Thread.sleep(2000);
System.out.println("当前线程 : " + Thread.currentThread().getName() + "结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
final ChangeLock changeLock = new ChangeLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
changeLock.method();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
changeLock.method();
}
}, "t2");
t1.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
运行
由于,lock改变了
并不是一个锁
锁对象改变,持有的锁就不同了
所以,没有同步