1.同一个线程可以持有多个锁
代码如下
private String lock1 = "lock1"; private String lock2 = "lock2"; private String lock3 = "lock3";
final Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock1){
Log.i(TAG,"进入lock1......开始休眠");
Log.i(TAG,"当前锁1状态"+Thread.holdsLock(lock1));
Log.i(TAG,"当前锁2状态"+Thread.holdsLock(lock2));
Log.i(TAG,"当前锁3状态"+Thread.holdsLock(lock3));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
Log.i(TAG,"进入lock2......开始休眠");
Log.i(TAG,"当前锁1状态"+Thread.holdsLock(lock1));
Log.i(TAG,"当前锁2状态"+Thread.holdsLock(lock2));
Log.i(TAG,"当前锁3状态"+Thread.holdsLock(lock3));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock3){
Log.i(TAG,"进入lock3......开始休眠");
Log.i(TAG,"当前锁1状态"+Thread.holdsLock(lock1));
Log.i(TAG,"当前锁2状态"+Thread.holdsLock(lock2));
Log.i(TAG,"当前锁3状态"+Thread.holdsLock(lock3));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
thread1.start();
打印结果如下
2019-05-10 15:47:46.876 25769-25800/? I/CustomView: 进入lock1......开始休眠
2019-05-10 15:47:46.876 25769-25800/? I/CustomView: 当前锁1状态true
2019-05-10 15:47:46.876 25769-25800/? I/CustomView: 当前锁2状态false
2019-05-10 15:47:46.876 25769-25800/? I/CustomView: 当前锁3状态false
2019-05-10 15:47:51.877 25769-25800/calc.superdy.myapplication I/CustomView: 进入lock2......开始休眠
2019-05-10 15:47:51.878 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁1状态true
2019-05-10 15:47:51.879 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁2状态true
2019-05-10 15:47:51.879 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁3状态false
2019-05-10 15:47:56.880 25769-25800/calc.superdy.myapplication I/CustomView: 进入lock3......开始休眠
2019-05-10 15:47:56.880 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁1状态true
2019-05-10 15:47:56.881 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁2状态true
2019-05-10 15:47:56.881 25769-25800/calc.superdy.myapplication I/CustomView: 当前锁3状态true
2.一把锁只能在同一时刻被一个进程持有
查看holdsLock的源码注释
Returns <tt>true</tt> if and only if the current thread holds the * monitor lock on the specified object.
这里的monitor lock 其实就是前一篇文章的monitor ,holds就是前一篇文章的own
Only one thread at a time can own an object's monitor.
本文通过实例演示了同一线程如何持有多个锁,并强调了一把锁在同一时刻只能被一个进程持有的特性。通过源码注释解读,深入理解monitor锁的概念及持有状态。
552

被折叠的 条评论
为什么被折叠?



