我有一些关于Java同步的问题。

public class A {

    private int i;

    public A (int t) { i = t; }

    public synchronized void increment() {
        i++;
    }

    public synchronized void decrement() {
        i--;
    }
}

假设我有一个如上所述实现的类,并且创建了一个类型为A的对象(p)。

我知道只能有一个线程执行p.increment(),但是另一个线程可以同时执行p.decrement()吗?

谢谢〜

最佳答案

synchronized不保护方法。 synchronized不保护对象。 synchronized只做一件事,而只有一件事。

您编写增量方法的方式实际上只是编写此内容的一种简便方法:

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

这种较长的表达方式清楚地表明synchronizedthis上进行操作。

因此,synchronized要做的一件事是:JVM不允许两个线程同时在同一个对象上同步。

如果您拥有类型A的对象p,则答案为“否”。 JVM不允许一个线程在另一个线程执行递减操作的同时执行增量操作,因为两个线程都将尝试在同一对象p上进行同步。

另一方面,如果您有一个对象p和另一个对象q(均为A),则一个线程可能在p.increment()调用中,而另一个线程在q.decrement()调用中。这是因为每个线程将在不同的对象上同步,并且允许这样做。

附注:synchronized实际上做了另一件事,与Java概念“发生之前”有关。在深入了解多线程编程之前,您应该了解一下(Google是您的 friend )。

关于java - Java中的同步和同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26665995/

10-14 10:34