我对Java同步有疑问。我想知道我的类中是否有三个Synchronized方法,并且一个线程在一个synchronized方法中获取锁定,其他两个将被锁定?我问这个问题是因为我对以下陈述感到困惑。
当一个线程在一个对象的同步方法中时,所有其他希望执行此同步方法或该对象的任何其他同步方法的线程都必须等待。此限制不适用于已具有锁定并正在执行对象的同步方法的线程。这种方法可以调用对象的其他同步方法而不会被阻塞。当然,任何线程
都可以随时调用对象的非同步方法
答案 0 :(得分:11)
java中的同步是通过在某个特定对象上监视监视器来完成的。因此,如果您这样做:
class TestClass {
SomeClass someVariable;
public void myMethod () {
synchronized (someVariable) {
...
}
}
public void myOtherMethod() {
synchronized (someVariable) {
...
}
}
}
然后在不修改someVariable
的情况下,通过执行2个不同的线程来保护这两个块。基本上,据说这两个块与变量someVariable
同步。
当您在方法上放置synchronized
时,它基本上与synchronized (this)
相同,即对该方法执行的对象进行同步。
那是:
public synchronized void myMethod() {
...
}
表示与:
相同public void myMethod() {
synchronized (this) {
...
}
}
因此,回答你的问题 - 是的,线程将无法同时在不同的线程中调用这些方法,因为它们都持有对同一监视器的引用,即this
对象的监视器。 / p>
答案 1 :(得分:1)
是。
要执行同步方法线程需要获取对象的锁定,并且一次只有一个线程可以获取对象的锁定。
答案 2 :(得分:0)
每个java对象(类实例)都有一个互斥对象。方法前面的synchronized关键字意味着正在运行的线程必须锁定该对象的互斥锁。事实上,
public synchronized doSomething(){
...
}
与此完全相同:
public doSomething(){
synchronized(this){
...
}
}
所以是的,每个类实例只有一个线程执行一个synchronized方法。
请注意,有时这可能不是最理想的,因为您希望保护修改,但对于并发读取没有问题,在这种情况下,您可能需要查看ReadWriteLock而不是synchronized关键字。
答案 3 :(得分:0)
因此,目前只有线程规则和其他人必须等待输入任何同步方法,无论裁决线程是否正在执行该方法。
答案 4 :(得分:0)
是的,除了获得锁定的线程之外的所有线程都必须等到锁定再次释放才能执行三个同步方法中的一个。
请记住,synchronized方法与
包围的普通方法相同synchronized(this) {
// method body
}
答案 5 :(得分:0)
这是真的,它就是这样做的。同样有必要使该对象的数据保持一致。
假设这个验证不存在,并且存在一个变量x,它由2个不同的同步方法xxx()和yyy()操纵。
所以如果线程A得到方法xxx()的锁定,它操纵x = 5,第二个线程B得到方法yyy()的锁定并且操纵x = -5所以在方法xxx()的末尾,线程A期待x = 5但是它会得到x = 0,这是错误的。
这就是为什么以这种方式实施的。
答案 6 :(得分:0)
如果一个类有4个同步方法,那么一次只有一个线程可以访问这些方法。 我猜这里有疑问,每个线程一次可以为单个类实例访问diff同步方法。答案是不。一次只有一个线程可以访问同步方法。
答案 7 :(得分:-1)
我不确定你发现它是什么令人困惑,但是当你持有它时,获取一个锁阻止其他线程获取它,并且一个类的所有非静态同步方法在同一个对象上同步,所以答案是假设我理解正确,你的问题是'是'。我不知道“同步”还有什么意思,或者与其他任何含义有什么用。