作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
关于 synchronized 和 volatile,我还有些不明白。
我了解线程可以在本地安全更改。到目前为止,我读到的是 synchronized > volatile。
假设我有一个参数不是 long 或 double 所以基本上是一个标准的整数(没有原子)。
我有一个同步方法,我用这个整数做了很多工作。所有线程都会得到这个 Integer 的更新版本吗?或者我是否也必须将其声明为 volatile?
public class stackoverflow {
private int x = 0;
public synchronized void rechnen(){
//dosomething
}
}
基本上在 rechnen() 完成后,我有 10000 个线程,所有线程都会得到 x 的更新版本,因为我的方法是同步的吗?还是我也必须将其声明为 volatile?
最佳答案
是的,他们将获得更新版本。 synchronized
保证两件事:更改的可见性和原子性。 volatile
只是保证变化的可见性。 Java 保证 synchronized block 内的代码不会被优化(通过混合 synchronized
block 内部和外部的命令),因此在 synchronized block 结束后,其中变量的每次更改都将对所有线程可见。
关于java - 易变和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34527707/
我是一名优秀的程序员,十分优秀!