为了账号安全,请及时绑定邮箱和手机立即绑定

线程安全模式

线程安全模式

Go
森林海 2022-09-19 10:05:11
我是这样写的代码:首先,我用蚂蚁创建例程池: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 的位置之外,没有额外的线程处理。

因此,使用线程的唯一方法是将词法分析器/解析器实例关联到线程,并仅从此单个线程访问该线程。每个解析器实例使用专用线程,并且永远不要在线程之间共享词法分析器/解析器。


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号