Java synchronized关键字-它是否保护类方法不被同时执行?

Java synchronized关键字-它是否保护类方法不被同时执行?,java,Java,我需要澄清一下syncronized关键字在Java6中是如何工作的 使用下面的示例类 class Carrier { private String[] _collection = new String[2]; public Carrier() { this._collection[0] = "abc"; this._collection[1] = "123"; } public syncronized void change(int c

我需要澄清一下syncronized关键字在Java6中是如何工作的

使用下面的示例类

class Carrier {

   private String[] _collection = new String[2];

   public Carrier() {
       this._collection[0] = "abc";
       this._collection[1] = "123";
   }

   public syncronized void change(int cId) {
       Thread.sleep(3000);
       this._collection[cId] = "changed";
   }

}
现在,在应用程序中的某个位置,引用Carrier类的同一对象实例,调用.change()方法,可能同时调用

...carrier.change(1);


syncronized关键字是否会阻止方法的异步执行?它只是将调用排入.change()队列,等待每个调用完成吗?

是的,它将阻止两个方法调用同时执行

...carrier.change(1);
这就是
synchronized
关键字的主要用途


当一个同步方法运行时,它会在调用它的对象上获得一个“锁”。这意味着当该方法持有锁时,不能在该对象上运行其他同步代码。一旦方法执行完毕,它将释放锁,其他同步方法可以获得该对象的锁。

是,是。(注意,它是
同步的
,而不是
同步的

是的,第二个线程将在第一个线程执行时阻塞。这是因为他们都试图通过
this
在同一个对象上获取监视器。因此,您的
change
方法相当于:

public void change(int cId) {
    synchronized (this) {
        Thread.sleep(3000);
        this._collection[cId] = "changed";
    }
}
就我个人而言,我不喜欢在“this”上进行同步,因为这意味着可以访问对象本身的任何其他代码都可以获得相同的监视器。我更喜欢创建一个仅用于锁定的对象,该对象只有类中的代码才能访问:

private final Object lock = new Object();

public void change(int cId) {
    synchronized (lock) {
        Thread.sleep(3000);
        this._collection[cId] = "changed";
    }
}

对于两个线程在同一对象上调用
change
,这仍然具有相同的效果,因为两个线程仍将获取相同的监视器—仅与锁特定对象关联的监视器。

是-synchronized关键字阻止不同线程同时执行该方法


注:“类方法”是一种
静态
方法。“实例方法”(即非静态)是您的问题所在。

synchronized
用于防止当前编程中同时访问。 例如,当您必须访问客户端时,一个用于读取,另一个用于写入:


锁定以获得详尽的解释。

太好了。我会把它添加到我的词汇表中。和“存在”(不是蜜蜂);-)<代码>它是否会将调用排入.change()的队列
。这取决于你所说的排队是什么意思。没有指定执行顺序,因此它不是一个有序队列,但是是的,其他线程将被迫等待。