【问题标题】:How to block object from changing while executing thread如何在执行线程时阻止对象更改
【发布时间】:2016-06-18 14:32:25
【问题描述】:

我在执行线程时遇到问题。当我在执行另一个更新该对象的线程时从主线程中删除一个对象时,就会出现问题。当第二个线程尝试更新对象时,由于对象不再存在而发生异常。我的问题如下:当我运行我的特殊线程时,如何阻止其他线程修改我的对象?我希望我的特殊线程优先于应用程序中的所有其他线程。

非常感谢

【问题讨论】:

标签: java multithreading synchronization locking


【解决方案1】:

有多种方法可以实现:

(a) 使用锁定或同步(在对象上使用同步块)方式来同步删除和对象访问调用

(b) 编辑:使用初始值为1的原子整数。删除时将其标记为0,修改时将其标记为-1(完成后重新标记为1),修改线程将在继续之前检查if (atomicCounter != 0)修改对象和删除线程会在删除前检查while (atomicCounter != -1)(即等待变为零)

(c) 使用与倒计时锁存器相反的东西(倒计时锁存器,Java 库中不存在)

(d) 不要做任何事情,如果发生异常,使用catch正确处理并finally阻塞,让线程代码继续你希望的样子

【讨论】:

  • 您的建议 (b) 根本不起作用:如果线程 A 检查计数器并发现它等于 1(可以安全地继续)会发生什么。然后线程B将计数器设置为0并删除对象,然后线程A继续修改...?
  • 还是不行。问题仍然存在:两个并发线程都可以检查标志,都发现它等于 1,并且都继续相互干扰。您的情况 (b) 使问题在测试期间不太可能发生,但它实际上并没有防止问题发生。
  • 既然您提到了AtomicInteger,您可能想了解AtomicInteger.compareAndSet(...) 方法。它公开了作为synchronized 块和java.util.concurrent 中许多算法基础的硬件原语(在x86 架构中称为CMPXCHG)。 en.wikipedia.org/wiki/Compare-and-swap
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多