【问题标题】:How we can take a lock ob object using ReentrantLock? [duplicate]我们如何使用 ReentrantLock 锁定对象? [复制]
【发布时间】:2023-03-23 15:09:03
【问题描述】:

这里我们对 Node 对象 "f" 进行锁定并以同步的方式执行一些更新操作。

有人可以告诉我,我们如何使用 ReentrantLock 转换此代码?

我读到我们可以使用 lock() 和 unlock() 方法锁定代码块,但看不到任何地方我们可以如何锁定对象。

public void updateNodeValue(){
    Node<K,V> f = getNode();
    synchronized (f) {
        // do something here to update the value in Node Object f
    }
}

public Node<K,V> getNode(){
    //  return NodeObject from an Array
}

【问题讨论】:

  • 您需要在Node 上声明一个ReentrantLock 并将其锁定在同步块的位置。
  • 你的意思是说 class Node { final int hash;最后的 K 键;挥发性 V 值; volatile Node 下一个;最终锁锁; Node(int hash, K key, V val, Node next) { this.hash = hash; this.key = 键;这个.val = val; this.next = 下一个; this.lock = new ReentrantLock(); } } 并像 Lock l = node.lock; 一样使用它l.lock();做一点事(); l.unlock();这样,它只会在特定的 Node 对象上锁定,其他线程可以使用其他 Node 对象。
  • 类似的东西。
  • 你所说的即使使用同步也会发生,线程只会等待锁定的对象,只有,如果线程有与锁定不同的对象,它无论如何都会进入同步块.我认为@shmosel 的建议似乎是正确的答案
  • 更多详情请参考链接问题。这个问题也提供了更好的见解:stackoverflow.com/questions/442564/…

标签: java multithreading


【解决方案1】:

锁与实例字段无关。它们锁定了实例字段所在的整个对象。

Lock striping 是一个选项。

【讨论】:

  • 谁说过实例字段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
相关资源
最近更新 更多