gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:14:11 25 4
gpt4 key购买 nike

我需要澄清 syncronized 关键字在 java 6 中的工作原理。

使用以下示例类。

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);

...

...carrier.change(1);

syncronized 关键字会阻止方法的异步执行吗?它会简单地将对 .change() 的调用排队,等待每个调用完成吗?

最佳答案

是的,第二个线程会在第一个线程执行时阻塞。那是因为它们都试图在同一个对象上获取监视器 - 在本例中是通过 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 而言,这仍然会产生相同的效果,因为两个线程仍然会获取相同的监视器 - 只是与特定锁对象关联的监视器.

关于Java synchronized 关键字 - 它是否保护类方法不被同时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6898505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com