![]() |
1
14
你说得对。volatile提供了可见性保证。synchronized提供了可见性保证和受保护代码段的序列化。对于非常简单的情况,volatile就足够了,但是使用volatile而不是同步很容易陷入麻烦。 如果你假设账户有调整余额的方法,那么volatile就不够好了
显然这是错误的,因为两个线程都读取当前值并独立更新,然后将其写回(读、计算、写)。volatile在这里没有帮助,因此您需要同步以确保一个线程在另一个线程开始之前完成整个更新。 我发现,如果在编写一些代码时,我认为“我可以使用volatile而不是synchronized吗”,答案很可能是“是的”,但是花时间/精力去弄清楚这一点以及出错的危险是不值得的(性能很小)。
|
![]() |
2
1
将帐户声明为易失性将受到以下问题和限制 1.“由于其他线程看不到局部变量, 此外,如果您试图在一个方法中声明一个volatile变量,在某些情况下您会得到一个编译器错误。 双getBalance(){ }
不能在具有synchronized的基元上同步, synchronized只适用于对象变量,其中as原语或对象变量可以声明为volatile 6. JVM解决了这个问题。因此,如果someAccountflag是最终静态的,那么它甚至不需要声明为volatile 或者您可以使用懒惰的单例初始化,将Account作为单例对象 并声明如下: |
![]() |
3
1
如果多个线程正在修改和访问数据,
如果单个线程正在修改数据,而多个线程尝试读取数据的最新值,请使用
但对于上述代码,
相关问题: |
![]() |
Khyxes · Java监视器中的同步方法 7 年前 |
![]() |
pathikrit · Scala部分函数应用语义+同步锁定 8 年前 |
![]() |
user2514421 · 多线程 9 年前 |
|
G Vaid · 同步对象:锁定代码与锁定对象 9 年前 |
![]() |
hermit · 显示奇怪结果的同步块 9 年前 |
![]() |
Raj · 如何使构造函数同步? 11 年前 |