我是这样写代码的:
var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) {
AnalyzeCommitDiff(commitDiff.(diffParsedType))
})*函数AnalyzeCommitDiff()包含我的antlr_analysis函数
然后我写了这些:
var (
lexerPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaLexer(nil)
}}
parserPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaParser(nil)
}}
newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} {
return new(TreeShapeListener)
}}
)
func executeJava(diffText string) javaparser.AnalysisInfoType {
input := antlr.NewInputStream(diffText)
lexer := lexerPool.Get().(*javaparser.JavaLexer)
defer lexerPool.Put(lexer)
lexer.SetInputStream(input)
stream := antlr.NewCommonTokenStream(lexer, 0)
p := parserPool.Get().(*javaparser.JavaParser)
defer parserPool.Put(p)
p.SetTokenStream(stream)
//p.AddErrorListener(antlr.NewDiagnosticErrorListener(true))
p.BuildParseTrees = true
p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL)
tree := p.CompilationUnit()
listener := newTreeShapeListener.Get().(*TreeShapeListener)
defer newTreeShapeListener.Put(listener)
antlr.ParseTreeWalkerDefault.Walk(listener, tree)
return javaparser.Infos
}但问题很明显是因为线程不安全。如何使我的代码线程安全?有人能给我举个例子吗?
发布于 2021-07-31 10:30:26
线程池不能使用ANTLR4。出于性能原因,除了解析器或lexer访问共享DFA的一个地方外,没有额外的线程处理。
因此,使用线程的唯一方法是将lexer/解析器实例关联到线程,并仅从这个单个线程访问该线程。在每个解析器实例中使用一个专用线程,不要在线程之间共享词汇/解析器。
https://stackoverflow.com/questions/68587939
复制相似问题