Java多线程锁对象的改变
用lock获取锁对象,当lock被修改以后,会产生是一把新的锁,另一个线程获取锁对象时会获取这把新的锁,导致线程异步执行.
public class ChangeLock {
private String lock = "lock";
private void method(){
System.out.println(Thread.currentThread().getName() + "开始"+"获取锁对象"+lock);
synchronized (lock) {
try {
System.out.println("当前线程 : " + Thread.currentThread().getName() + "获得了"+"锁对象"+lock);
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();
}
}
log信息
//正常试验结果
t1开始获取锁对象lock
当前线程 : t1获得了锁对象lock
t2开始获取锁对象change lock
当前线程 : t2获得了锁对象change lock
当前线程 : t1结束
当前线程 : t2结束
//sleep注销了的log信息
t1开始获取锁对象lock
t2开始获取锁对象lock
当前线程 : t1获得了锁对象lock
当前线程 : t1结束
当前线程 : t2获得了锁对象change lock
当前线程 : t2结束
网友评论