[code="java"]public class IncreaseTest {
private int value = 0;
public synchronized int increment() {
return value++;
}
}[/code]
方法increment()是线程安全的吗?还是必须要加上关键字:volatile
[code="java"]private volatile int value = 0;[/code]
是的,因为你已经加了synchronized keyword 了,就是所谓的原子性保证了。
有关原子性的问题可以看看 《thinking in java》 的 concurrency 部分内容。
如果可以通过反射访问该字段,则不安全。
如果所有的访问都是通过increment方法访问,则是线程安全的。
sync关键字限制了同一时刻只有一个线程可以访问该方法。
是线程安全的。value是private类型。只能通过increment方法操作,并且increment已经做了同步
通过添加synchronized关键字,就可以保证在同一时间只能有一个访问,他会添加锁机制。然而volatile该关键字是在处理多线程时,变量能够共享,例如,定义一个变量K,当有多个线程同时都需要使用K时,volatile关键字可以保证,每个线程在用K时,都会使用最新的K值。volatile关键字可以保证每个线程在使用K值之前,去刷新k所在的内存值,从而保证每个线程使用的都是最新的值。但是volatile并不能一定保证每次的数据都是你想要的,因为这还需要考虑到jvm的堆和栈。
如果其他的方法没用通过反射机制直接方位value,那么就是安全的
不是线程安全的,同步的关键字在只能提高安全级别,不能绝对完全解决同步问题,曾经就在项目中碰到了这类问题,在同步下面居然能实例化两个单例
increment()方法前加了synchronized关键字修饰,这个方法是线程安全