求助:关于ReentrantLock的lock方法的疑问

我是戴寒 发布于 2016/05/06 08:12
阅读 129
收藏 0
public class App {
static class NumberWrapper {
public int value = 1;
}


public static void main(String[] args) {
//初始化可重入锁
final ReentrantLock lock = new ReentrantLock();

//第一个条件当屏幕上输出到3
final Condition reachThreeCondition = lock.newCondition();
//第二个条件当屏幕上输出到6
final Condition reachSixCondition = lock.newCondition();

//NumberWrapper只是为了封装一个数字,一边可以将数字对象共享,并可以设置为final
//注意这里不要用Integer, Integer 是不可变对象
final NumberWrapper num = new NumberWrapper();
//初始化A线程
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
//需要先获得锁
lock.lock();
try {
System.out.println("threadA start write1");
System.out.println("ThreadA:"+lock.getHoldCount()+"次");
//A线程先输出前3个数
while (num.value <= 3) {
System.out.println(num.value);
num.value++;
}
//输出到3时要signal,告诉B线程可以开始了
reachThreeCondition.signal();
} finally {
lock.unlock();
}
lock.lock();
try {
//等待输出6的条件
reachSixCondition.await();
System.out.println("threadA start write2");
//输出剩余数字
while (num.value <= 9) {
System.out.println(num.value);
num.value++;
}


} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}


});




Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
try {
lock.lock();
System.out.println("threadB aquare lock");
System.out.println("ThreadB:"+lock.getHoldCount()+"次");
while (num.value <= 3) {
//等待3输出完毕的信号
reachThreeCondition.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
try {
lock.lock();
//已经收到信号,开始输出4,5,6
System.out.println("threadB start write");
while (num.value <= 6) {
System.out.println(num.value);
num.value++;
}
//4,5,6输出完毕,告诉A线程6输出完了
reachSixCondition.signal();
} finally {
lock.unlock();
}
}


});




//启动两个线程
threadB.start();
threadA.start();
}

}

第一个问题:两个线程A和B都进入了各自的第一个lock方法里??为什么能进入,不是应该等待另一个释放锁吗?毕竟用的是同一个Reentrantlock
第二个问题:既然都进入了,但是他们都进入后,打印出的count都为1??我理解的是一个为1,一个2,毕竟用的是同一个Reentrantlock,,

谢谢了,



加载中
0
xpbob
xpbob

getHoldCount的功能是查询当前线程保持此锁定的次数。 这个API更多用于调试,看你是不是用完释放锁了,由于在两个线程里看,结果互不影响,之所以都能进入lock方法是因为await让线程阻塞,此时就会释放锁资源,另一个线程就可以抢锁了,在你看来就是两个线程都进入lock

我是戴寒
我真的以为是两个都进入了,汗!!!
我是戴寒
赞赞赞,你说的太对了
0
首席撸出血
首席撸出血
最好看一下  这个类的源码,你就能知道是为什么了
返回顶部
顶部