如何解决Antlr v4 线程安全模式
我的代码是这样写的:
- 首先我用蚂蚁创建例程池:
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
}
但由于不是线程安全的,显然存在问题。 如何使我的代码线程安全? 谁能给我举个例子?
解决方法
线程池不适用于 ANTLR4。出于性能原因,除了解析器或词法分析器访问共享 DFA 的一处之外,没有额外的线程处理。
因此,您可以使用线程的唯一方法是将词法分析器/解析器实例关联到一个线程,并仅从该单个线程访问它。每个解析器实例使用一个专用线程,并且永远不要在线程之间共享词法分析器/解析器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。