- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我帮助维护和构建一个相当大的 Swing GUI,其中包含许多复杂的交互。我经常发现自己修复了由于代码中其他地方的某些竞争条件而导致事情进入奇怪状态的错误。
随着代码库变得越来越大,我发现通过文档指定哪些方法具有线程限制变得不太一致:最常见的是必须在 Swing EDT 上运行的方法。同样,了解并提供静态感知(我们的自定义)监听器在 EDT 上按规范通知是有用的。
所以我想到这应该是可以使用注释轻松执行的东西。瞧,至少存在一种静态分析工具,CheckThread ,它使用注释来完成此操作。它似乎允许您将方法声明为仅限于特定线程(最常见的是 EDT),并且会标记尝试调用该方法的方法,而不会同时声明自己仅限于该线程。
因此,从表面上看,这似乎只是对源代码和构建周期的一种低痛苦、巨大的 yield 。我的问题是:
我知道它是否适合我们取决于我们的情况。但是我从来没有听说过有人在实践中使用过这样的东西,老实说,它似乎并没有从一些一般性的浏览中占据多少。所以我想知道为什么。
最佳答案
此答案更侧重于您问题的理论方面。
从根本上说,您是在断言:“此方法仅在某些线程下运行”。这个断言与您可能做出的任何其他断言并没有真正的不同(“该方法只接受小于 17 的整数作为参数 X”)。问题是
大多数此类断言必须来自软件设计人员,因为他们是唯一知道意图的人。对此的传统术语是“按契约(Contract)设计”,尽管大多数 DBC 方案仅在 当前 程序状态(C 的 assert 宏)并且它们确实应该在程序的过去和 future 状态(“时间断言”),例如,“这个例程将分配一个存储 block ,最终一些代码将释放它”。可以构建工具来尝试以色调方式确定断言是什么(例如,Engler 的断言归纳工作;其他人已经在该领域做过工作)。这很有用,但误报是一个问题。实际上,要求设计人员编写此类断言的代码似乎并不特别繁重,而且确实是很好的长期文档。您是否使用特定的“契约(Contract)”语言结构或 if 语句(“if Debug && Not(assertion) Then Fail();”)或将它们隐藏在注释中实际上只是为了方便。当语言允许直接编写这样的断言时,这很好。
静态检查此类断言很困难。如果您只坚持当前状态,则静态分析器几乎必须对整个应用程序进行完整的数据流分析,因为满足断言所需的信息可能来自应用程序的另一部分创建的数据。 (在您的情况下,“EDT 内部”信号必须来自分析应用程序的整个调用图,以查看是否有任何调用路径导致来自非 EDT 线程的线程的方法)。如果您使用时间属性,则静态检查几乎还需要某种状态空间验证逻辑;这些目前仍然是相当多的研究工具。即使使用了所有这些机器,静态分析仪在分析中通常也必须“保守”;如果他们不能证明某事是假的,他们几乎不得不假设它是真的,因为停机问题。
你从哪里得到这样的分析仪?鉴于所需的所有机器,它们很难制造,因此您应该期望它们很少见。如果有人 build 了一个,那就太好了。如果不是...作为一般规则,您不希望自己从头开始执行此操作。最好的长期希望是拥有可用于构建此类分析器的通用程序分析机器,以摊销构建所有基础设施的成本。 (我构建了程序分析工具基础;参见我们的 DMS Software Reengineering Toolkit)。
让构建此类静态分析器“更容易”的一种方法是将它们处理的案例限制在较窄的范围内,例如 CheckThread。我希望 CheckThread 能够完全按照它目前所做的那样做,而且它不太可能变得更强大。
“断言”宏和其他此类动态“当前状态”检查之所以流行,是因为它们实际上可以通过简单的运行时测试来实现。这很实用。这里的问题是您可能永远不会执行导致失败条件的路径。因此,对于动态分析,没有检测到故障并不是正确性的真正证据。感觉还是不错的。
底线:静态分析器和动态分析器各有所长。
关于java - 静态线程分析: Good idea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129833/
我正在使用 pytesseract(tesseract 版本 3.05)对以数字方式创建的打印 PDF 帐单进行 OCR(光学字符识别)。我对其进行预处理以去除任何颜色并将其设置为纯黑白和 600 D
以下是我尝试运行的代码,输出是Good。那么,我们可以使用类实现的接口(interface)的变量吗? interface IDummyInterface { public String TY
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个 Java 客户端,它通过 HTTP/XML 与远程服务器通信。 服务器以 XML 格式向我的客户端发送命令,如下所示: C1 ..... 大约有 10 个或更多不同的命令(C1
我在 android 应用程序上有一个奇怪的问题,我没有这样的表异常,但我确定数据库存在。对于某些将我重定向到此处其他帖子的人,我想补充一点,我正在自己的手机上尝试该应用程序而不是模拟器,这是因为我在
我在谷歌上搜索 RNGCryptoServiceProvider,其中包含有关如何限制最大值和最小值之间的范围并仍然获得均匀分布的示例。在我使用模运算符之前,但有时我会得到奇怪的值(高于最大值)...
这个问题在这里已经有了答案: calling constructor of a class member in constructor (5 个答案) 关闭 4 年前。 我有一个非指针类成员需要在构
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
作为hadoop配置什么好.. 大量小型机器,每台具有 512 MB Ram 或少量大型机器(大约 2Gb 或 4GB Ram) 我可以选择两者中的任何一个,因为我的节点是虚拟机.. 请分享您的想法.
伙计们,我是vue新手所以不知道如何实现以下情况我如何获取当前选定行的数据这是代码
我经常访问一个名为 GOOD 的网站我特别喜欢一种审美风格;导航栏如何在网站背景中扩展其颜色。如果您访问该网站,就会明白我的意思。 在 CSS 中,我怎样才能以最简单的方式复制它?我已经用 z-ind
我有一个存在主义假设,例如: H : exists (a : A) (b : B) (c : C), P a b c 我想分解为: a : A b : B c : C H0 : P a b c 战术d
在 Github 上,我注意到一些拉取请求说它们“适合合并”,因为它们通过了 Travis构建通过。我已经使用了一点 Travis,它如何与 Github 上的拉取请求集成? 这是我正在谈论的内容的屏
刚刚在 Apple docs: 中找到 Note: Although good for occasional communication between threads, you should not
我正处于一个应用程序的概念阶段,该应用程序将有大量音频/视频输入和输出。我想用Java来做;但不知何故我还没有完全相信。你怎么认为?到底能有多糟糕?有什么建议吗? 为什么我想到 Java: 这是我最熟
我正在用 Java 重新实现 .Net API,该 API 指定了一大堆事件,但 java 并不隐式支持。 我将使用观察者模式,但由于事件的数量,我真的不想让界面变得困惑。 我想知道声明一个“Even
我的类有很多方法,其中一些方法是用注释标记的。每个方法可以有很多注释,例如 @StepAnnotation(name="Action1" ) @SequenceAnnotation(name="tra
启用GD后(通过调用enableSecureCommunication或对应用程序进行身份验证),将自动保护NSURLConnection。它是如何做到的? 最佳答案 我的猜测是,Good Dynam
我是 Vue 的新手并且陷入了困境,如果有人建议我如何做到这一点,我不知道该怎么做,让我先展示我的代码 save 并在脚本中 data(){ return{
考虑以下代码: private List types; if(!getTest().contains(type)) { return Color.LIGHT_GRAY;
我是一名优秀的程序员,十分优秀!