注意:另一个答案是Java实际正在执行的操作
synchronized(x) {
if(t != (t = tail));
}
等同于
synchronized(x) {
t = tail;
if(t != t) {
}
}
基本上,()运算符返回被分配的内容的引用。
public class Test {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
if(a != (b = a)) {
System.out.println("however, there is an issue with a != (a = b), Java bug");
} else {
System.out.println("assignment first, obvious by inspection");
}
}
}
然而,相同的代码在 C 中可以正常运行。如果我要猜测,这在 Java 中是无意的,任何从 C 上的类似事情的偏离都是愚蠢的。Oracle 可能不希望它被废弃,假设它是一个无意的 bug,这很可能是。
我下次再和他们谈话的时候会解决这个问题。我仍然对他们在与苹果公司合谋影响在国防部的 Adobe 事件中设置我母亲主页为 ask.com 感到生气。不过 Apple 公司在我必须点击超过 400 次才能重试我女儿的视频库重新下载失败后,一周内修复了 iTunes,所以这个问题只限于 Oracle。微软也受影响,因此每个人都对此感到不满。
#include <iostream>
static int ref = 0;
class t {
public:
t(int x) : x(x), r(ref) { ref++; }
t(const t& o) : x(o.x), r(o.r) { }
t& operator=(const t& o) { x = o.x; r = o.r; return *this; }
bool operator!=(const t& o) const { return r != o.r; }
private:
int x;
int r;
};
int main() {
t a(1);
t b(2);
if(a != (a = b)) {
std::cout << "assignment\n";
} else {
std::cout << "no assignment\n";
}
return 0;
}
ConcurrentLinkedQueue
中这个“复杂”的实现步骤(!)似乎源自这个变更集:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/902486a8e414#l3.202 - Marco13continue retry;
)也是我在代码审查中永远不会接受的,但这个代码库的这个区域非常特殊和微妙。我只是认为(或者可能只是希望?-至少:我必须假设),Doug Lea有深刻的技术原因来确切地做到这一点。在某些情况下(比如这种情况),我很想听听他们的意见... - Marco13