我是这样写的代码:首先,我用蚂蚁创建例程池:var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) { AnalyzeCommitDiff(commitDiff.(diffParsedType))})*函数分析提交Diff() 包含我的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}但显然存在问题,因为线程不安全。如何使代码线程安全?谁能给我举个例子吗?
1 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
线程池不适用于 ANTLR4。出于性能原因,除了一个由解析器或词法分析器访问共享 DFA 的位置之外,没有额外的线程处理。
因此,使用线程的唯一方法是将词法分析器/解析器实例关联到线程,并仅从此单个线程访问该线程。每个解析器实例使用专用线程,并且永远不要在线程之间共享词法分析器/解析器。
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消
