gpt4 book ai didi

java - 锁定可变对象 - 为什么它被认为是一种不好的做法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:17 25 4
gpt4 key购买 nike

查看此 answer .它说:

Six really bad examples;

...

locking on a mutable field. e.g. synchronized(object) { object = ...; }

锁定可变字段有什么问题?如果 object 被声明为 final 但不是不可变类怎么办?

最佳答案

这是一个坏主意,因为如果另一个线程更改了临界区中的引用,线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。示例:

 synchronized(lock1) {
lock1 = new Object();
sharedVariable++;
}

假设有 2 个线程试图进入这个临界区。线程1进入,线程2等待。线程 1 进入,重新分配 lock1 并继续。现在线程 2 看到一个与线程 1 获得的锁不同的锁,它也是空闲的,因此它也可以进入临界区。乐趣随之而来!

如果对象是final,则无法将引用重新分配给其他对象,因此上述问题不再适用。

关于java - 锁定可变对象 - 为什么它被认为是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9622315/

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