【问题标题】:Condition in class body?课堂上的情况?
【发布时间】:2018-09-14 20:50:55
【问题描述】:

我注意到 Java 类有一些非常不寻常的地方。

如果我在类主体中实例化一个条件(来自锁),它不会实例化对象。这是一个例子:

private class ConcurrentQ{
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        Lock readLock = readWriteLock.readLock();
        Lock writeLock = readWriteLock.writeLock();
        Condition emptyList = readLock.newCondition(); //PROBLEM!
...

}

如果我做了ConcurrentQ q = new ConcurreqntQ(),它不会实例化,但如果删除//PROBLEM! 行它工作正常。

我能知道为什么吗?

【问题讨论】:

  • 你检查documentation了吗?
  • @shmosel,对不起,我没有,我应该有。那么如何使用ReadWriteLocks 的条件?
  • Re, "... 它不会实例化" 如果您在问题中包含任何错误消息的文本可能会有所帮助。
  • 可以在写锁上创建条件。
  • new ConcurrentQ() 不能什么都不做。它要么返回对新创建的ConcurrentQ 实例的引用,要么抛出异常。如果它抛出一个异常,那么就会有一条消息,除非……你写的代码会捕获异常并忽略它吗?

标签: java multithreading


【解决方案1】:

Condition 类为线程提供了在执行临界区时等待某个条件发生的能力。

当线程获得对临界区的访问权但没有执行其操作的必要条件时,可能会发生这种情况。例如,读取线程可以访问共享队列的锁,该队列仍然没有任何数据可消耗。

对于 Writer 线程: 写锁提供了一个 Condition 实现,它的行为方式与写锁的行为方式相同,就像 ReentrantLock newCondition 提供的 Condition 实现对 ReentrantLock 所做的那样。 当然,条件只能与写锁一起使用。读锁不支持 Condition,readLock().newCondition() 抛出 Unsupported OperationException。

希望这能帮助......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多