同步对象,java
这个问题在这里已经有了答案:
首先是一些基础知识:
同步对象用作打开限制区域的门(同步块)的键。
只要一个线程进入这个限制区域,它就拥有监视器(锁定),以便其他线程不能进入。 当一个线程退出受限区域时,它释放监视器,另一个线程可以接受它。
这意味着每个使用相同同步对象的同步块将阻止其他线程进入,直到显示器可用(解锁)。
创建新的虚拟对象的原因是什么?
原因是你应该使用别人对象无法访问的对象,而不是那些使用它们的对象。 这就是为什么同步对象是private
。 如果他们可以被其他人访问,其他人可能会在应用程序中某处的同步块中使用它们。 如果同步对象是例如public
那么每个其他对象都可以使用它。 这可能会导致意外的使用并可能导致死锁。
所以你应该确定谁将获得对同步对象的引用。
锁由线程访问,以检查代码当前是“正在使用”还是可以在锁定对象本身后执行。 你可能会认为它可能是自动的,但它有一个使用编译器无法推断的用法:你可以使用同一个锁来同步多个代码块,同时限制对其中任何一个的访问。
在我看来,虚拟Object
只是代表了同步的角度。
为了同步不同的线程,你必须能够声明同步点和(如果需要)从代码的不同部分访问这一点。 例如:
private Object lock = new Object();
public void inc1() {
synchronized(lock) {
c1++;
}
}
public void inc2() {
synchronized(lock) {
c2++;
}
}
在这个例子中显示了来自不同代码部分的同步点的使用。
而且由于Java是面向对象的语言,即Java中的语言单位是Object,所以我们完全有这样的构造。
顺便说一句,您可以使用任何对象作为同步点。 你甚至可以做到这一点:
public void inc1() {
synchronized(this) {
c1++;
}
}
链接地址: http://www.djcxy.com/p/76259.html