繁体   English   中英

内在锁定和同步

[英]Intrinsic Locks and Synchronization

我目前在oracle.com上阅读有关内部锁定和同步的内容,在这里我来到这个特定的例子:

同步语句对于通过细粒度同步提高并发性也很有用。 例如,假设类MsLunch有两个从不一起使用的实例字段c1c2 必须同步这些字段的所有更新,但没有理由阻止c1的更新与c2的更新交错 - 这样做会通过创建不必要的阻塞来减少并发性。 我们创建两个对象仅用于提供锁,而不是使用同步方法或以其他方式使用与此关联的锁。

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}

在本节之前, synchronized方法解释如下:

public synchronized void increment() {
    this.c++;
}

应该是哪个,请纠正我,如果我错了,就像

public void increment() {
    synchronized(this) {
        c++;
    }
}

如果我没有为increment()添加功能,那是正确的吗?

我现在的问题来自这句话:

但是没有理由阻止c1的更新与c2的更新交错

我不确定我是否完全理解“ 交错 ”在这种情况下的含义。 这是否意味着,如果我从MsLunch示例中删除lock2

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    // private Object lock2 = new Object(); // 'lock2' is no more!

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock1) { // Using 'lock1' here too
            c2++;
        }
    }
}

我可能遇到锁定问题? 假设thread-1运行到inc1() ,从lock1获取锁,但在能够增加或释放锁之前被挂起。 现在thread-2正在输入inc2() ,其中为lock1创建了另一个锁。 这是正在使用另一种避免什么lock2 ,这就是为什么我不会简单地使用的原因this是锁定供应商? 或者换句话说:这会导致问题吗?

这里有两个锁,只是为了有可能独立增加c1c2而不是在释放锁时等待。 因此,如果Thread-1进入c1同步块并获取lock1 ,则另一个Thread-2将能够在不等待thread-1释放锁定时增加c2


重要提示:

使用this作为共享显示器有自己的问题,因为上的实例的引用MsLunch是外部可见MsLunch 例如。 Thread-3能够在synchronized (msLunchInstance)之外获取: synchronized (msLunchInstance)的锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM