我有一些关于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++;
}
}
表达它的这种更长的路明确表示synchronized
正在操作this
。
因此,要做的一件事synchronized
是:JVM不允许两个线程同时在同一个对象上同步。
如果您拥有类型A的对象p,则答案为“否”。JVM不允许一个线程在另一个线程执行递减操作的同时执行增量操作,因为两个线程都将尝试在同一对象p上进行同步。
另一方面,如果您有一个对象p和另一个对象q(均为A),则一个线程可能在p.increment()调用中,而另一个线程在q.decrement()调用中。这是因为每个线程将不同的对象上进行同步,这是允许的。
PS:synchronized
实际上做了与Java概念有关的另一件事,即“之前发生”。在深入了解多线程编程之前,您应该了解一下(Google是您的朋友)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句