lifeidgp
lifeidgp
2013-03-02 21:15

这样的Java代码是线程安全的吗?

已采纳

[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]

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • qq359593234 咖啡机 8年前

    是的,因为你已经加了synchronized keyword 了,就是所谓的原子性保证了。
    有关原子性的问题可以看看 《thinking in java》 的 concurrency 部分内容。

    点赞 评论 复制链接分享
  • icefan02 小樊 8年前

    increment()方法前加了synchronized关键字修饰,这个方法是线程安全

    点赞 评论 复制链接分享
  • alvin198761 alvin198761 8年前

    不是线程安全的,同步的关键字在只能提高安全级别,不能绝对完全解决同步问题,曾经就在项目中碰到了这类问题,在同步下面居然能实例化两个单例

    点赞 评论 复制链接分享
  • mythsaa mythsaa 8年前

    如果其他的方法没用通过反射机制直接方位value,那么就是安全的

    点赞 评论 复制链接分享
  • zhangwenbovsA zhangwenbovsA 8年前

    通过添加synchronized关键字,就可以保证在同一时间只能有一个访问,他会添加锁机制。然而volatile该关键字是在处理多线程时,变量能够共享,例如,定义一个变量K,当有多个线程同时都需要使用K时,volatile关键字可以保证,每个线程在用K时,都会使用最新的K值。volatile关键字可以保证每个线程在使用K值之前,去刷新k所在的内存值,从而保证每个线程使用的都是最新的值。但是volatile并不能一定保证每次的数据都是你想要的,因为这还需要考虑到jvm的堆和栈。

    点赞 评论 复制链接分享
  • u2244118984 u2244118984 8年前

    是线程安全的。value是private类型。只能通过increment方法操作,并且increment已经做了同步

    点赞 评论 复制链接分享
  • u014411256 zhangxzhi 8年前

    如果可以通过反射访问该字段,则不安全。
    如果所有的访问都是通过increment方法访问,则是线程安全的。
    sync关键字限制了同一时刻只有一个线程可以访问该方法。

    点赞 评论 复制链接分享

相关推荐