我们正在使用Compact Language Detector 2的Java包装程序实现。
the detect() function线程安全吗?
据我了解,它调用this library function。
否,如果本机代码是用CLD2_DYNAMIC_MODE
设置编译的,则不是线程安全的,您可以使用函数isDataDynamic()
进行测试。
本机函数操纵静态类变量kScoringtables
。如果在编译时定义了CLD2_DYNAMIC_MODE
,则此变量将初始化为一组空表(NULL_TABLES
),以后可以将其装入动态数据,或可能由其他线程卸载。
kScoringtables.quadgram_obj
可能为非空at the line 1762 null check,然后在将其更改为第1777行中的kScoringtables
对象之前更改了ScoringContext
地址。在这种情况下,错误的指针将在第1785行传递给ApplyHints
,可能导致在第1606行发生坏事。
[这将是非常罕见的竞争条件,但仍然可能,并且出于标准“懒惰获取程序”不是线程安全的相同原因也不是线程安全的。
为了使该线程安全,您必须测试isDataDynamic()
返回false,或者确保在执行过程中其他线程无法调用loadDataFromFile
,loadDataFromRawAddress
和unloadData
函数此方法(或至少直到您经过第1777行...)