gpt4 book ai didi

java - 共享资源可以安全地用作同步块(synchronized block)的锁吗?

转载 作者:行者123 更新时间:2023-12-02 08:31:41 24 4
gpt4 key购买 nike

我经常发现自己有这样的代码

private static final MyType sharedResource = MyType();
private static final Object lock = new Object();
...
synchronized(lock)
{
//do stuff with sharedResource
}

这真的有必要吗,或者可以将sharedResource用作锁本身吗

private static final MyType sharedResource = MyType();
...
synchronized(sharedResource)
{
//do stuff with sharedResource
}

注意:示例中显示的同步块(synchronized block)将存在于正在工作的方法中,而不是方法本身或同步方法。

编辑:一些答案​​中指出了一个非常好的观点,即如果我们正在处理多个共享资源,则第一个“对象”技术要安全得多。

警告 事实上,sharedResource 是静态,这一点很重要!如果它是static,那么锁定this的同步方法或同步块(synchronized block)将不起作用。锁对象也必须是静态

最佳答案

两者的优缺点

第一个选项优点:允许锁定概念,而不是对象。如果您必须为单个操作锁定多个资源(通常不建议这样做,但有时是必要的),那么您可以不用担心竞争条件。

缺点:对象仍然可以被修改,因此您需要确保对对象的访问仅限于遵守外部锁的方法。

第二个选项的优点:锁定对象应该防止其他人修改它(尽管您应该仔细检查确切的语义。)编辑:与上面相同的缺点 - 如果方法不同步 在内部,您仍然可能遇到不遵守约定的方法。

缺点:您阻止对所有方法的访问,甚至是那些与您尝试操作的内容无关的方法,这可能会导致速度减慢并可能导致死锁。但是,您可以轻松地证明,如果是这种情况,您的对象做了太多工作,应该被分解。

编辑:请允许我在这里澄清第 2 部分(将 MyType 分解为 MyFoo 和 MyBar 的案例有待辩论......)

class MyType {
Foo foo;
Bar bar;

void doFoo() { foo.do(); }
void doBar() { bar.do(); }
}

class MyActions {
MyType thing;

void lotsOfFoo() {
// blocks bar :-(
synchronized(thing) { thing.doFoo(); }
}

void lotsOfBar() {
// blocks foo :-(
synchronized(thing) { thing.doBar(); }
}

}

就我个人而言,我更频繁地使用选项 1(这就是为什么我不确定选项 2 中的该部分)。

关于java - 共享资源可以安全地用作同步块(synchronized block)的锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3214918/

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