如何知道显式锁是否已成功提供内存可见性?

时间:2012-09-15 09:26:01

标签: java multithreading concurrency

这是代码从某处复制到互联网:
这种显式锁定如何工作?

public class Lock {
  private Object lockObj = new Object();
  private Thread owner;
  private int lockCount;

  /**
   * Waits for up to 'maxWait' milliseconds to acquire the lock,
   * and returns true if the lock was acquired.
   **/
  public boolean acquireLock(int maxWait) throws InterruptedException {
    Thread currentThread = Thread.currentThread();
    synchronized (lockObj) {
      if (owner == currentThread) {
        lockCount++;
        return true;
      }
      long waitedSoFar = 0L;
      while (owner != null) {
        long t0 = System.currentTimeMillis();
        long timeToWait = maxWait - waitedSoFar;
        if (timeToWait <= 0)
          return false;
        lockObj.wait(timeToWait);
        if (owner != null) {
          waitedSoFar += System.currentTimeMillis() - t0;
        }
      }
      owner = currentThread;
      lockCount = 1;
      return true;
    }
  }
  public void releaseLock() {
    Thread currentThread = Thread.currentThread();
    synchronized (lockObj) {
      if (owner == currentThread) {
        lockCount--;
        if (lockCount == 0) {
          owner = null;
          lockObj.notify();
        }
        return;
      } else {
        // Only the owner can release the lock!
        throw new IllegalStateException();
      }
    }
  }
}

我没有看到任何特殊代码来保证内存可见性。与并发相关的唯一事情是“synchronized(lockObj){...}”

那是魔术吗? 在获取某些同步监视器之前,CPU是否只刷新其所有缓存? 或者相反?
在发布一些同步监视器时,CPU是否只刷新其所有缓存?

编辑:
好吧,我得到了一些与并发等待/通知相关的事情。

想一想。这个显式锁如何工作?

  1. 获取锁定,修改变量(以防止其他线程获取它),然后释放锁定。
  2. 做任何事。
  3. 获取锁定,修改变量(允许其他线程获取它)。
  4. 其他一些线程获取锁定,并循环...
  5. 之前发生的关系只在3到4之间吗? 或者1到3之间是否也保证发生关系?那么2是保证内存可见性吗?

1 个答案:

答案 0 :(得分:1)

没有cpu可以获取的同步监视器。监视器是在您编程的语言的运行时中实现的构造,在本例中为java。

java运行时负责此锁定并禁止其他代码输入同步的代码块。 cpu只看到处理它的指令。

关于你的缓存问题:cpu不只是决定刷新缓存。缓存保持不变,直到被覆盖。