我正在阅读“Java并发实践”一书。作者没有提供任何关于ad hoc线程限制的例子,只是说它“描述了维护线程限制的责任何时完全落在实现上”。
任何人都可以举个例子吗?我无法理解它与堆栈限制,ThreadLocal等的区别。
感谢。
答案 0 :(得分:3)
这意味着作为开发人员,您有责任确保对该对象的引用不会在线程之外转义(因此是临时的)。
例如,如果您考虑此示例(Java Concurrency in Practice中的堆栈限制示例的简化版本)
public int countLions(Collection<Animal> animals) {
int count = 0;
for (Animal animal : animals) {
if (animal.getType() == "Lion") {
count++;
}
}
return count;
}
对于局部变量计数,不可能获得对它的引用,因此语言语义确保您不能在外部公开引用。因此,你有Stack Confinement。如果您使用的是Object引用而不是int count
,那么您必须更加小心,不要在方法之外公开该引用。
因此,ad-hoc线程限制基本上意味着开发人员必须确保对象引用不会意外地暴露给外部世界。在ad-hoc线程confimenet中,没有特定的语言功能(如Stack Confinement,Thread Local)来帮助开发人员,完全由开发人员来管理Thread Confinement。
答案 1 :(得分:3)
我在理解关于ad-hoc线程限制的文本时也遇到了问题。但在https://www.cs.umd.edu/class/spring2013/cmsc433/Notes/10-CMSC433-Confinement.pdf的帮助下,我认为这意味着:
最特别的线程配置方式是简单地用简单的语言(比如英语)向其他程序员说/他们不应该访问特定的对象。
PDF链接提及:
您可以决定一组约定来限制使用 共享状态,然后努力让所有代码都遵循 他们。您 的订单同意可以做什么和 什么时候确保不需要锁。如果你管理它, 那很棒。但是,您使用 100%人类级别 保护而不是任何语言级别,可以 很难。 临时协议的一部分可能是您在a中共享州 非常具体的方式;共享的所有内容都标记为 volatile和每个共享对象,只有一个线程 永远被允许写到它。在一个单一的作家, 多读者场景,如果你不需要同步 变量是易变的。 非常脆弱,非常微妙!
所以一个例子可以像记录这样的东西一样简单:
// Don't use this object in other threads than Thread X
private SomeType someObject;
public SomeType getSomeObject() { return someObject; }
或
// Don't modify this from any other thread than Thread X.
// So use it read-only for those other threads.
private volatile int someNumber;
虽然书中的文字:
描述了维护线程限制的责任何时完全落在实现上
确实生成了&#34;实施&#34;在这种情况下有些不清楚。这个词建议代码,但是使用了&#34;文档&#34;或者客户端实现/使用共享数据,将更加清晰。
答案 2 :(得分:1)
答案 3 :(得分:0)
在本书中,如果可能,您需要使用更强大的线程限制形式(StackConfirmed或ThreadLocal)。
它们的示例类在这里: