gpt4 book ai didi

java - 用于线程正确性的断言或注释

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:54 26 4
gpt4 key购买 nike

我正在作为使用多线程的项目的一部分进行编码,并且我正在尝试寻找方法来检测代码中的线程错误。我可以使用一些现有的工具来帮助我做到这一点吗?

例如-断言我的方法正在由正确的线程调用或者使用注释进行某种静态检查,类似于 @Nullable 和 @NotNull,以检测我的代码何时从错误的线程调用方法。

虽然该项目是多线程的,但几乎不需要同步,因为不同的线程不访问相同的对象,它们有自己的实例。一般来说,有四个线程同时运行

  • 服务器线程=维护一个或多个游戏的状态客户
  • 客户端线程 = 处理用户输入,维护本地线程复制/缓存服务器数据以进行渲染
  • NetworkMessage 线程 = 处理传入/传出消息服务器和客户端之间
  • 渲染线程 = 将本地数据处理为渲染信息显卡
这些类有时仅适用于其中一个线程(例如,用户输入轮询仅限于客户端),有时它们适用于多个线程(例如,射弹的计算移动同时在客户端和服务器上使用相同的代码以减少感知延迟)。有几次我从错误的线程调用了一个方法,导致了微妙且不可重复的错误以及几乎严重的显示器屏幕损坏(来 self 的拳头)

到目前为止我想到的是这样的:

public void myMethodThatAssumesClientThreadOnly() {
assert checkThread(CLIENT);
// can now happily call other client-thread code without fear
}

但我更喜欢类似于 @Nullable 的静态检查

例如

@Thread(CLIENT)
void myClientMethod() {
//client-only stuff here
}

@Thread(SERVER)
void myServerMethod() {
//server-only stuff here
}

@Thread(CLIENT + SERVER)
void myClientAndMethod() {
myClientMethod(); // error- server thread might call client method
}

不幸的是,作为一个注释新手,我不知道这是否容易或实际上非常困难。

有什么指点吗?我无法想象我是第一个寻找这样的东西的人。

TGG

最佳答案

Checker Framework允许创建编译时静态检查器来验证程序的正确性。它的GUI Effect Checker与你想要的类似。以下是 its manual 的节选摘录:

One of the most prevalent GUI-related bugs is invalid UI update or invalid thread access: accessing the UI directly from a background thread.

If a background thread accesses a UI element such as a JPanel (by calling a JPanel method or reading/writing a field of JPanel), the GUI framework raises an exception that terminates the program.

It is difficult for a programmer to remember which methods may be called on which thread(s). The GUI Effect Checker solves this problem. The programmer annotates each method to indicate whether:

  • It accesses no UI elements (and may run on any thread).
  • It may access UI elements (and must run on the UI thread).

The GUI Effect Checker statically enforces that UI methods are only called from the correct thread.

GUI 效果检查器经过调整可以检测和防止 GUI 线程错误,而您则担心客户端-服务器线程错误。但是,原理是相同的,您应该能够通过相对较少的更改来调整 GUI 效果检查器以满足您的需求。

有一个paper讨论使用 GUI 效果检查器的案例研究。

另一种方法是改编 bug finder用于查找多线程应用程序中的错误。与 GUI 效果检查器不同,它不能保证不存在线程错误。不过,它在实践中是有效的,并且不需要您在程序中编写任何注释。

最后,Checker 框架还包含 Lock Checker确保正确的同步。这有助于防止并发错误,尽管它与您对线程安全的主要担忧是正交的。

关于java - 用于线程正确性的断言或注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com