在Martin Odersky的演讲中:http://youtu.be/9PkxE_L_LMo,在49分钟他谈到了由于静态数据导致的“编译器不可重入”的问题。
我对Java中的“reentrancy”一词的含义有基本的解释(for example,如果我以递归的方式调用synchronized方法,那么我就不会陷入死锁),但我仍然不明白马丁在说什么。
如果代码是按照第49分钟的说明编写的,为什么不能在同一个JVM中运行两个编译器?
他在谈论什么样的重演?
我假设当他在谈话的49分钟内提到重入时,他并不意味着允许人们在Java中使用递归同步方法调用而不会陷入死锁的那种重入。我对吗?我不确定。
他是否只是简单地提到这样一个事实:当on具有从多个线程访问的可变静态数据时,由于竞争条件,程序将无法正常工作?
请赐教!
答案 0 :(得分:3)
他在谈论什么样的重演?
他正在谈论可重入的计算机科学定义。除了wikipedia article之外,这个IBM developerWorks article明确指出:
可重入函数是一个可供多个任务使用的函数 同时不用担心数据损坏。相反,a 非重入函数是不能由多个函数共享的函数 除非通过以下方式确保对功能的互斥 使用信号量或在关键部分禁用中断 代码可以在任何时间中断可重入函数 稍后恢复而不会丢失数据。可重入的功能 在全局变量时使用局部变量或保护其数据 使用。
由于静态变量是面向对象的全局变量版本,Odersky正在讨论一种不保护其全局变量的编译器。
他只是简单地提到在 [sic] 上有可变静态数据的事实 从多个线程访问,然后程序将无法正常工作 由于竞争条件?
基本上,是的。当并发调用时,编译器可能无法正常工作,因为它会混合有关多个程序的信息,从而导致可能的损坏。