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.