Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的即席线程限制示例_Java - Fatal编程技术网

Java中的即席线程限制示例

Java中的即席线程限制示例,java,Java,我正在读《实践中的Java并发性》一书。作者没有提供任何特殊线程限制的例子,只是说它“描述了何时维护线程限制的责任完全落在实现上” 谁能举个例子吗?我无法理解它与堆栈限制、线程本地等的区别 谢谢。在您阅读本书时,如果可能,请使用一种更强大的线程配置形式(StackConfirm或ThreadLocal) 下面是它们的示例类: 事实上,这种方法意味着线程限制完全依赖于程序员来控制自己,java语言语法保证没有提供。你看这个词的特殊含义就会很清楚。这意味着作为一名开发人员,你有责任确保没有对对

我正在读《实践中的Java并发性》一书。作者没有提供任何特殊线程限制的例子,只是说它“描述了何时维护线程限制的责任完全落在实现上”

谁能举个例子吗?我无法理解它与堆栈限制、线程本地等的区别


谢谢。

在您阅读本书时,如果可能,请使用一种更强大的线程配置形式(StackConfirm或ThreadLocal)

下面是它们的示例类:


事实上,这种方法意味着线程限制完全依赖于程序员来控制自己,java语言语法保证没有提供。你看这个词的特殊含义就会很清楚。

这意味着作为一名开发人员,你有责任确保没有对对象的引用逃逸到线程之外(因此是特殊的)

例如,如果考虑这个示例(实践中java并发的栈限制实例的简化版本)

public int countLions(收集动物){
整数计数=0;
用于(动物:动物){
if(animal.getType()=“Lion”){
计数++;
}
}
返回计数;
}
对于局部变量count,不可能获得对它的引用,因此语言语义确保不能在外部公开引用。这样,就得到了堆栈限制。如果您使用的是对象引用而不是
int count
,那么您必须更加小心,不要将该引用暴露在方法之外


因此,临时线程限制基本上意味着开发人员必须确保对象引用不会意外地暴露于外部世界。在ad-hoc thread confimenet中,没有特定的语言功能(如堆栈限制、线程本地)来帮助开发人员,只有开发人员才能管理线程限制。

我在理解有关ad-hoc thread confimenet的文本时遇到问题。但在我的帮助下,我认为这意味着:

最特别的线程确认方式是简单地用普通语言(如英语)对其他程序员说/记录他们不应该访问特定对象

PDF链接提到:

您可以决定一组约定来限制 共享状态,然后让所有代码都遵循 他们。你同意关于做什么和做什么的顺序 这样可以确保不需要锁。如果你能做到, 太好了。但是,您使用的是100%人类级别 保护而不是任何语言级别的保护 这很难。 临时协议的一部分可能是你们在一个国家里共享一个州 非常具体的方式;共享的所有内容都标记为 易失性,对于每个共享对象,只需要一个线程 曾经被允许给它写信。在一个作家身上, 多读卡器场景,如果 变量是不稳定的。 非常脆弱,非常微妙

因此,一个例子可以简单到记录如下内容:

// Don't use this object in other threads than Thread X
private SomeType someObject;
public SomeType getSomeObject() { return someObject; }

尽管书中的文字:

描述何时维护线程限制的责任完全落在实现上

这确实使“实施”一词在这方面有些不清楚。“建议代码”一词,但“文档”一词的使用或共享数据的客户端实现/使用,在imho中会更清楚

// 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;