Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在执行线程时阻止对象更改_Java_Multithreading_Synchronization_Locking - Fatal编程技术网

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
中许多算法的基础。