public class a{
private aLock = new ReentrantLock();
public void test(){
aLock.lock();
try{
this.test2()
}finally{
aLock.unlock();
}
}
public void test2(){
...
}
}
多个线程持有同一个 a 对象 当一个线程调用 test 方法锁定的同时 另一个线程调用 test2 方法会阻塞吗? 我有点没明白这个锁到底算是加在哪的,如果是 synchronized 方法那肯定对象锁。 求解释
1
owenliang 2017-09-28 18:19:07 +08:00 2
你应该读读书。
|
2
zgbgx1 2017-09-28 18:23:41 +08:00
|
3
alqaz 2017-09-28 18:33:12 +08:00 via Android
锁在 lock 和 unlock 之间。如果 test2 调用了 lock 那么就会,否则,不会
|
4
haozhang 2017-09-28 18:33:24 +08:00 via iPhone 1
不是调用 test 会锁,进入了临界区域就会锁,从 lock 开始到 unlock 结束,这片区域就是临界区域。
|
6
misaka19000 2017-09-28 18:51:39 +08:00 via Android
Java 好像用的是 monitor 指令吧,一类是加在对象上,另一类好像是不需要加在对象上面的
|
7
sunqb 2017-09-28 19:00:37 +08:00 via Android
官方建议使用 synchronized,除非你有新的需求
|
8
domty 2017-09-28 19:18:31 +08:00
你试试写个测试不就知道了。
如果你 test2()这个方法没有对 aLock 进行加解锁操作的话,不会阻塞。 |
11
puritania OP |
12
misaka19000 2017-09-28 20:35:54 +08:00
反编译一下就知道是怎么回事了
|
13
ihuotui 2017-09-28 20:40:06 +08:00 via iPhone
aqs 高级同步队列
|