[英]Intrinsic Locks and Synchronization
我目前在oracle.com上阅读有关内部锁定和同步的内容,在这里我来到这个特定的例子:
同步语句对于通过细粒度同步提高并发性也很有用。 例如,假设类MsLunch有两个从不一起使用的实例字段
c1
和c2
。 必须同步这些字段的所有更新,但没有理由阻止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
是锁定供应商? 或者换句话说:这会导致问题吗?
这里有两个锁,只是为了有可能独立增加c1
和c2
而不是在释放锁时等待。 因此,如果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.