在Martin Odersky的谈话中早期实现Scala编译器中的重入和静态数据。它们有什么关系?

时间:2015-01-05 08:58:41

标签: java scala concurrency compilation reentrancy

在Martin Odersky的演讲中:http://youtu.be/9PkxE_L_LMo,在49分钟他谈到了由于静态数据导致的“编译器不可重入”的问题。

我对Java中的“reentrancy”一词的含义有基本的解释(for example,如果我以递归的方式调用synchronized方法,那么我就不会陷入死锁),但我仍然不明白马丁在说什么。

如果代码是按照第49分钟的说明编写的,为什么不能在同一个JVM中运行两个编译器?

他在谈论什么样的重演?

我假设当他在谈话的49分钟内提到重入时,他并不意味着允许人们在Java中使用递归同步方法调用而不会陷入死锁的那种重入。我对吗?我不确定。

他是否只是简单地提到这样一个事实:当on具有从多个线程访问的可变静态数据时,由于竞争条件,程序将无法正常工作?

请赐教!

1 个答案:

答案 0 :(得分:3)

  

他在谈论什么样的重演?

他正在谈论可重入的计算机科学定义。除了wikipedia article之外,这个IBM developerWorks article明确指出:

  

可重入函数是一个可供多个任务使用的函数   同时不用担心数据损坏。相反,a   非重入函数是不能由多个函数共享的函数   除非通过以下方式确保对功能的互斥   使用信号量或在关键部分禁用中断   代码可以在任何时间中断可重入函数   稍后恢复而不会丢失数据。可重入的功能   在全局变量时使用局部变量或保护其数据   使用。

由于静态变量是面向对象的全局变量版本,Odersky正在讨论一种不保护其全局变量的编译器。

  

他只是简单地提到在 [sic] 上有可变静态数据的事实   从多个线程访问,然后程序将无法正常工作   由于竞争条件?

基本上,是的。当并发调用时,编译器可能无法正常工作,因为它会混合有关多个程序的信息,从而导致可能的损坏。