210得票5回答
为什么这个Java程序会终止,尽管表面上它不应该(而且也没有)?

今天我实验室里的一个敏感操作完全出错了。电子显微镜上的一个驱动器超出了范围,在一系列事件之后,我损失了价值1200万美元的设备。我已经将故障模块中的40000多行缩小到了这个位置: import java.util.*; class A { static Point current...

63得票4回答
CopyOnWriteArrayList如何保证线程安全?

我查看了OpenJDK源代码的CopyOnWriteArrayList,发现所有写操作都受到相同锁的保护,而读操作却没有任何保护。据我所知,在JMM中,对变量(读和写)的所有访问都应该受到锁的保护,否则可能出现重排序效应。 例如,set(int, E)方法包含以下行(在锁定状态下):/* 1...

59得票1回答
指令重排和先行发生关系

在《Java并发实战》一书中,我们多次被告知,我们程序的指令可以被编译器、JVM或处理器重新排序,因此我们应该假设执行的程序不会按照源代码中指定的顺序完全执行。然而,讨论Java内存模型的最后一章提供了一个“先行发生”规则的列表,表明JVM保留了哪些指令顺序。其中第一个规则是:“程序顺序规则。...

54得票2回答
为什么`synchronized (new Object()) {}`是一个无操作语句?

在下面的代码中: class A { private int number; public void a() { number = 5; } public void b() { while(number == 0) { ...

52得票3回答
Java对象头包含什么内容?

你能给我一些关于对象头中究竟存储了什么信息的资料吗?我知道这可能取决于JVM,但至少对于HotSpot呢?我正在寻找特别是第一行的精确描述。 我已经阅读了几篇无法通过我发现的信息进行正面验证的文章。也许你有一个链接到OpenJDK wiki的页面可以解释这些内容呢?

51得票8回答
不可变对象的所有属性都必须是final的吗?

不一定需要将所有属性设置为final,我个人认为是这样的。但我不确定我的看法是否正确。

48得票1回答
Java内存模型和C++11内存模型有哪些相似之处?

新的C++标准引入了内存模型的概念。Stack Overflow上已经有人提出了相关问题,例如它是什么意思,它如何改变我们在C++中编写代码的方式等等。 我想了解C++内存模型与旧的广为人知的Java内存模型(1.5)之间的关系。它们是相同的吗?它们相似吗?它们有任何显著的差异吗?如果有,为...

47得票4回答
Dalvik虚拟机和Java内存模型(Android上的并发编程)

我正在开发涉及大量并发编程的Android项目,并且我要实现一些自定义的线程间通信方式(java.util.concurrent中的内容不适合我的目的)。 一般而言,并发编程并不容易,但在Dalvik上似乎更加困难。为了获得正确的代码,你应该知道一些具体的事情,这就是在Dalvik中出现问题...

47得票1回答
什么是TLAB(线程本地分配缓冲区)?

我找不到一个全面的资源来清晰地解释这个概念。我的理解是,线程在eden区中被分配一些内存块以分配新对象。竞争的线程最终会在eden区中找到一些相邻的内存块。如果第一个线程在其TLAB中用完了所有的空闲区域会发生什么?它会请求一个新的eden区块吗?

45得票6回答
Java中同步的内存影响

JSR-133 FAQ表示: 但是同步不仅仅意味着互斥。同步确保线程在同步块之前或期间写入的内存对于在同一监视器上同步的其他线程以可预测的方式可见。在我们退出同步块后,我们会释放监视器,这会刷新缓存到主内存中,使得该线程进行的写入可以对其他线程可见。在进入同步块之前,我们需要获取监视器...