public static void main(String[] args){
try{
final Lock lock = new ReentrantLock();
final Condition cond = lock.newCondition();
final BlockingQueue<Object> q = new LinkedBlockingQueue<Object>();
final ConcurrentControl parent = new ConcurrentControl(new AtomicInteger(1));
ExecutorService service = Executors.newCachedThreadPool();
service.submit(new Runnable() {
public void run() {
while(true)
parent.test(lock, q,cond);
}
});
service.submit(new Runnable() {
public void run() {
while(true)
parent.checkGetLock(lock,cond);
}
});
service.submit(new Runnable() {
public void run() {
while(true){
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
q.add(new Object());
}
}
});
}finally{
}
}
private void checkGetLock(Lock lock,Condition cond){
lock.lock();
try{
System.out.println("获得锁了");
cond.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
private void test(Lock lock,BlockingQueue<Object> q,Condition cond){
lock.lock();
try{
q.take();//该阻塞方法会导致 lock一直占有 不释放 尽管 take 内部是 await的
cond.await();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
最近 因为 一个take阻塞 一直占有当前获取的lock 导致奇怪的现象 这里把自己的测试代码贴下 免得下次犯错
最新推荐文章于 2022-02-26 16:15:08 发布