Java 如何在执行线程时阻止对象更改
我在执行线程时遇到问题。当我在执行另一个更新该对象的线程时,从主线程删除一个对象时,就会出现问题。当第二个线程尝试更新对象时,由于对象不再存在而发生异常。我的问题是:当我运行我的特殊线程时,如何阻止其他线程修改我的对象?我希望我的特殊线程优先于应用程序中的所有其他线程Java 如何在执行线程时阻止对象更改,java,multithreading,synchronization,locking,Java,Multithreading,Synchronization,Locking,我在执行线程时遇到问题。当我在执行另一个更新该对象的线程时,从主线程删除一个对象时,就会出现问题。当第二个线程尝试更新对象时,由于对象不再存在而发生异常。我的问题是:当我运行我的特殊线程时,如何阻止其他线程修改我的对象?我希望我的特殊线程优先于应用程序中的所有其他线程 非常感谢您可以通过多种方式实现这一点: (a) 使用锁定或同步(在对象上使用同步块)方式同步删除和对象访问调用 (b) 编辑:使用初始值为1的原子整数。删除时将其标记为0,修改时将其标记为-1(完成后重新标记为1),修改线程将在继
非常感谢您可以通过多种方式实现这一点: (a) 使用锁定或同步(在对象上使用同步块)方式同步删除和对象访问调用 (b) 编辑:使用初始值为1的原子整数。删除时将其标记为0,修改时将其标记为-1(完成后重新标记为1),修改线程将在继续修改对象之前检查
if(atomicCounter!=0)
,删除线程将在删除前检查while(atomicCounter!=-1)
(即等待变为零)
(c) 使用与倒计时闩锁相反的东西(倒计时闩锁,它不存在于Java库中)
(d) 不要做任何事情,如果出现异常,请使用catch和finally block正确处理它,并让线程代码继续执行您希望的操作听起来您需要读写器锁定。您可以在此处提供一些代码示例吗。。理解上下文会更好。建议您按照Java并发教程的方式进行操作:似乎您不使用同步块。您的建议(b)根本不起作用:如果线程a检查计数器并发现它等于1(可以安全继续),会发生什么情况。然后线程B将计数器设置为0并删除对象,然后线程A继续修改…?仍然不起作用。问题仍然存在:两个并发线程都可能检查标志,都发现它等于1,并且都继续相互干扰。您的案例(b)使问题在测试期间不太可能发生,但实际上并不能阻止问题的发生。由于您提到了
AtomicInteger
,您可能希望了解AtomicInteger.compareAndSet(…)
方法。它公开了硬件原语(在x86体系结构中称为CMPXCHG),它是synchronized
块和java.util.concurrent
中许多算法的基础。