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