微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Antlr v4 线程安全模式

如何解决Antlr v4 线程安全模式

我的代码是这样写的:

  1. 首先我用蚂蚁创建例程池:
var pool,_ = ants.NewPoolWithFunc(5,func(commitDiff interface{}) {
    AnalyzeCommitDiff(commitDiff.(diffParsedType))
})

*函数 AnalyzeCommitDiff() 包含我的 antlr_analysis 函数

  1. 然后我写了这些:
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 举报,一经查实,本站将立刻删除。