ReentrantLock中tryLock的使用
请各位帮忙看看,以下是代码
输出信息是:
1
thread1
(此处无等待)
0
thread2
0
Exception in thread "pool-1-thread-2" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460)
at test.reentrantlock.Test.foo(Test.java:43)
at test.reentrantlock.Test.access$0(Test.java:31)
at test.reentrantlock.Test$2.run(Test.java:26)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
为什么线程2会立刻获得锁,而且获得锁之后的HoldCount是0,最后抛出的异常是因为线程1准备释放锁时,它已经不是锁持有者了。
static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new Runnable() {
@Override
public void run() {
foo("thread1");
}
});
es.execute(new Runnable() {
@Override
public void run() {
foo("thread2");
}
});
}
private static void foo(String threadName) {
try {
lock.tryLock();
System.out.println(lock.getHoldCount());
System.out.println(threadName);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} finally {
lock.unlock();
System.out.println(lock.getHoldCount());
}
}
输出信息是:
1
thread1
(此处无等待)
0
thread2
0
Exception in thread "pool-1-thread-2" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460)
at test.reentrantlock.Test.foo(Test.java:43)
at test.reentrantlock.Test.access$0(Test.java:31)
at test.reentrantlock.Test$2.run(Test.java:26)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
为什么线程2会立刻获得锁,而且获得锁之后的HoldCount是0,最后抛出的异常是因为线程1准备释放锁时,它已经不是锁持有者了。
...全文
相关推荐
ReentrantLock源码详解--公平锁、非公平锁
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。下面我们来深入了解一下它吧
java ReentrantLock详解
主要介绍了java ReentrantLock,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
详解Java多线程编程中互斥锁ReentrantLock类的用法
Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
Java源码解析之可重入锁ReentrantLock
今天小编就为大家分享一篇关于Java源码解析之可重入锁ReentrantLock,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Java多线程中ReentrantLock与Condition详解
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下


Java SE
