Java监视器-同步方法是否会阻止该对象中存在任何其他线程?
以下是否意味着对象的任何方法中只能有一个线程?或者多个线程可以使用不同的方法,而不是使用相同的方法?为什么?Java监视器-同步方法是否会阻止该对象中存在任何其他线程?,java,concurrency,synchronization,monitor,Java,Concurrency,Synchronization,Monitor,以下是否意味着对象的任何方法中只能有一个线程?或者多个线程可以使用不同的方法,而不是使用相同的方法?为什么? public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
以下是否意味着对象的任何方法中只能有一个线程
对。非静态synchronized
方法在this
上隐式同步。这相当于:
public void increment() {
synchronized(this) {
c++;
}
}
如果这是一段真正的代码,我建议您完全扔掉
SynchronizedCounter
类,改用
以下是否意味着对象的任何方法中只能有一个线程
对。非静态synchronized
方法在this
上隐式同步。这相当于:
public void increment() {
synchronized(this) {
c++;
}
}
如果这是一段真正的代码,我建议您完全扔掉
SynchronizedCounter
类,改用
以下是否意味着对象的任何方法中只能有一个线程
对于您的特定示例,是的,因为所有方法都是同步的和非静态的
如果您的类有任何未同步的方法,则不会阻止未同步的方法
如果您的类使用同步块而不是方法,并在不同的锁上同步它们,那么它可能会变得更加复杂
以下是否意味着对象的任何方法中只能有一个线程
对于您的特定示例,是的,因为所有方法都是同步的和非静态的
如果您的类有任何未同步的方法,则不会阻止未同步的方法
如果您的类使用同步块而不是方法,并在不同的锁上同步它们,则可能会变得更加复杂。当然,它们在
这个
对象上是同步的。如果您为不同的方法编写了自己的synchronized
块,那么情况就不会是这样了。当然,它们在这个对象上是同步的。如果您为不同的方法编写了自己的synchronized
块,那么情况就不会是这样了。除了您已有的好答案之外,请注意,同步以同样的方式防止任何其他线程获得锁,它还防止并发,因此,像您这样的类被多个线程访问的速度要比只被一个线程访问的速度慢,因为不获得锁的线程需要重新调度。除了您已有的好答案之外,请注意同步,以防止任何其他线程获得锁的相同方式,它也会防止并发,因此,像您这样的类由多个线程访问要比只由一个线程访问慢,因为不获得锁的线程需要重新调度。