通过 ReentrantLock 访问的字段是否需要 volatile 关键字?

发布于 2024-08-08 00:55:32 字数 772 浏览 9 评论 0原文

我的问题是,使用 ReentrantLock 是否可以保证字段的可见性,就像同步关键字提供的那样。

例如,在下面的类A中,字段sharedData不需要声明为易失性,因为使用了synchronized关键字。

class A 
{
  private double sharedData;

  public synchronized void method() 
  {
    double temp = sharedData;
    temp *= 2.5;
    sharedData = temp + 1;
  } 
}

然而,对于使用 ReentrantLock 的下一个示例,该字段上的 volatile 关键字是否必要?

class B 
{
  private final ReentrantLock lock = new ReentrantLock();
  private volatile double sharedData;

  public void method() 
  {
    lock.lock();
    try
    {
      double temp = sharedData;
      temp *= 2.5;
      sharedData = temp + 1;
    }
    finally
    {
      lock.unlock();
    }
  } 
}

我知道无论如何使用 volatile 关键字只会对性能造成很小的影响,但我仍然想正确编码。

My question refers to whether or not the use of a ReentrantLock guarantees visibility of a field in the same respect that the synchronized keyword provides.

For example, in the following class A, the field sharedData does not need to be declared volatile as the synchronized keyword is used.

class A 
{
  private double sharedData;

  public synchronized void method() 
  {
    double temp = sharedData;
    temp *= 2.5;
    sharedData = temp + 1;
  } 
}

For next example using a ReentrantLock however, is the volatile keyword on the field necessary?

class B 
{
  private final ReentrantLock lock = new ReentrantLock();
  private volatile double sharedData;

  public void method() 
  {
    lock.lock();
    try
    {
      double temp = sharedData;
      temp *= 2.5;
      sharedData = temp + 1;
    }
    finally
    {
      lock.unlock();
    }
  } 
}

I know that using the volatile keyword anyway will only likely impose a miniscule performance hit, but I would still like to code correctly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界和平 2024-08-15 00:55:32

安全无波动。 ReentrantLock 实现了 Lock,并且 Lock 的文档包括:

所有Lock实现都必须强制执行
相同的内存同步
内置提供的语义
监视器锁,如 The Java 中所述
语言规范,第三版
(17.4内存模型):

  • 成功的锁定操作具有
    相同的内存同步效果
    成功的锁定操作。
  • 成功的
    解锁操作具有相同的内存
    同步效应作为
    成功的解锁操作。

It's safe without volatility. ReentrantLock implements Lock, and the docs for Lock include this:

All Lock implementations must enforce
the same memory synchronization
semantics as provided by the built-in
monitor lock, as described in The Java
Language Specification, Third Edition
(17.4 Memory Model):

  • A successful lock operation has the
    same memory synchronization effects as
    a successful Lock action.
  • A successful
    unlock operation has the same memory
    synchronization effects as a
    successful Unlock action.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文