问十八:什么是重入?

 

如果有一个互斥锁,当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但是如果一个线程再次请求自己持有的对象锁临界资源时,将会成功,而不会进入阻塞状态

比如synchronized实现的锁机制,如果修饰代码块的话,它在字节码中就会有显示获取monitor锁的语义,而这个monitor在OpenJDK的源代码中可以看到它有一个_count和_owner的字段定义。大致意思就是由这两个字段判断是否是同一线程,同时记录当前锁被重复获取的次数。

线程如果再次获取锁,那么就会识别获取锁的线程是否为当前占据锁的线程,比较_owner字段是否相同。

如果不同就阻塞,获取moniter锁失败并且阻塞在monitorenter阶段。

如果发现是同一个线程的话,就会进入这个线程,同时_count加1,当锁被释放的时候,这个计数字段就会自减1,当计数字段为0的时候就代表锁被成功释放。

 

它将会成功

<think>嗯,用户的是编译原理中符号':='的含义。我记得在编译原理里,符号定义通常和形式文法有关,比如EBNF。不过具体到':=',可能需要查一下相关资料。 首先,根据用户提供的引用,引用[1]提到EBNF中的元符号,比如::= 表示左部由右部定义。可能用户提到的':='是不是和这个相关?或者是不是在某些特定语法中使用的符号? 然后,可能需要区分不同场景下的使用。例如,在EBNF中,::= 是定义符号,而某些编程语言可能使用:=作为赋值操作符,比如Pascal或Ada。但用户的题是在编译原理中的含义,所以可能更倾向于形式文法中的定义符号。 再仔细看引用[1]:“::= 表示左部的语法单位由右部定义”,所以这里的::= 是元符号,用来分隔左右部。而用户的是':=',中间只有一个冒号和一个等号,这可能和::=不同,是否是用户输入时的笔误?或者是否有另一种符号在编译原理中使用? 不过也有可能在某些文献或特定语法描述中,使用:=作为定义符号,但根据提供的引用,EBNF中使用的是::=。所以需要确认用户的题是否有误,或者是否存在其他上下文。 另外,考虑用户可能混淆了不同的符号,比如在词法分析或语法分析中,赋值符号和文法定义符号的区别。比如在语法分析中,LR分析里的产生式通常用->或::=,而:=可能出现在其他场合。 或者,可能用户看到的是某种特定语言的语法规则,其中使用了:=作为产生式符号。但根据标准EBNF,应该是::=。所以需要指出这一点,并说明可能的混淆情况。 总结来说,在标准EBNF中,定义符号是::=,而:=可能是其他用途,比如赋值操作符。需要结合用户提供的引用,明确回答,并指出可能的差异和注意事项。</think>在编译原理中,符号$:=$通常与形式文法定义相关,其含义需要根据具体上下文区分: 1. **EBNF中的元符号$::=$** - 在扩展巴科斯范式(EBNF)中,符号$::$表示**语法定义关系**,如引用[1]所述:“$::=$表示左部的语法单位由右部定义”。 - 示例:$<表达式> ::= <项> + <表达式> | <项>$,表示表达式由项和表达式组合或单独项构成[^1]。 2. **编程语言中的赋值符号$:=$** - 在Pascal、Ada等语言中,$:=$是**赋值操作符**,如$x := 5$表示将5赋值给变量$x$。但这属于具体语言的词法规则,而非编译原理的理论符号[^3]。 3. **符号混淆的特殊情况** - 若在语法规则中看到$:=$而非$::$,可能是文档排版错误或特定领域(如某些教材)的符号变体,但其核心语义仍为“定义为”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值