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

标签 java multithreading annotations assertions

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

例如- 断言我的方法正在由正确的线程调用 或者 使用注释进行某种静态检查,类似于 @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/

相关文章:

java - 为什么我不能在包上抑制警告?

android - 如何让android构建系统在应用程序中嵌入annotations.jar?

Spring:组件中的 Autowiring 服务为空

java - 为什么执行器服务比java 8中的顺序操作花费更多时间?

c++ - 在 DLL 中运行的工作线程在应用程序关闭时被杀死,然后才能正常关闭它们

java - 无法将 csv 文件中的数据读回数组

java - 正则表达式问题 - 排除某些字符

c++ - 每个线程一个类实例,C++11

java - 为什么数组不可扩展?

Java 2维整数数组检查是否存在