我是這樣寫的代碼:首先,我用螞蟻創建例程池: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 關注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消