Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,同步块可以在任何对象引用上同步?_Java - Fatal编程技术网

在Java中,同步块可以在任何对象引用上同步?

在Java中,同步块可以在任何对象引用上同步?,java,Java,我想知道是否有这种情况下,这一声明将是真实的和必要的。我所看到的所有示例仅在“this”参考上同步。有人能告诉我一个对象中的代码块如何在除此之外的任何其他引用上同步吗 在Java中,您可以使用synchronized构造在任何对象引用上创建本质锁,是的。阅读相关文章 not使用synchronized的直接示例是在类对象上进行同步时,该对象为。实际上,有很多有效的用途。您可能希望避免使用synchronized(this)来支持内部实现锁,否则您将设置一个限制,在内部使用该锁,而您不知道的其他代

我想知道是否有这种情况下,这一声明将是真实的和必要的。我所看到的所有示例仅在“this”参考上同步。有人能告诉我一个对象中的代码块如何在除此之外的任何其他引用上同步吗

在Java中,您可以使用
synchronized
构造在任何对象引用上创建本质锁,是的。阅读相关文章

not使用
synchronized
的直接示例是在
对象上进行同步时,该对象为。实际上,有很多有效的用途。您可能希望避免使用
synchronized(this)
来支持内部实现锁,否则您将设置一个限制,在内部使用该锁,而您不知道的其他代码可能会违反该限制

但是,您应该知道,通常情况下,您可以使用
可重入锁定
替换
已同步的
用法。您可以在中了解更多信息。

是的,可以这样做


同步块将使用该对象作为锁,而不是整个类。使用synchronized(this){}的人会对整个对象设置一个独占锁,这可能是您想要的。但是,您可能有类似于持久器的东西,这是唯一需要同步的东西。synchronized(persistener){},将提供一种粒度较小的方法来实现这一点。

是的,该语句是正确的

public class SyncTest{
    private Object obj = new Object();

    public void func1() {
        synchronized(obj) {
            obj.something();
        }
}
不想使用内部监视器的原因有很多(
synchronized(this)
)-其中一个原因是它会产生活跃度问题-在下面的代码中,B使用A的实例作为锁,可能是为了控制对该变量的访问。如果另一个线程使用相同的A实例并尝试运行
A.methodA()
,它将被阻止,直到
methodB()
结束

因此,使用内部监视器会暴露同步策略,并可能导致微妙的错误和性能问题

public class A {

    public synchronized void methodA() {}

}

public class B {
    A a = new A();
    public void methodB() {
        synchronized(a) {
            // do something a little long
        }
    }
    public A getA() {return a;}
}
如果A使用了内部监视器,则不可能出现该问题

public class A {
    private final Object lock = new Object();

    public void methodA() {
        synchronized(lock) {}
    }

}

另一种使用即席监控器有意义的场景是,一个类包含2个(或更多)不相关的对象,这两个对象都需要以同步方式访问。使用两个监视器而不是一个监视器可以减少争用,因为现在可以同时访问这两个对象。

。。。永远忘了这个词。只要确保你使用的对象足够复杂就行了。尝试在Boolean之类的类型上进行同步不会像您认为的那样,因为它实际上是在内部处理的。请确保锁是最终的。