[英]How synchronized Block In Java works? Variable reference or memory is blocked?
我有一种情况,我需要一些有关Java synchronized
块的建议。 我下面有一个班级考试:
Class Test{
private A a;
public void doSomething1(String input){
synchronized (a) {
result = a.process(input);
}
}
public void doSomething2(String input){
synchronized (a) {
result = a.process(input);
}
}
public void doSomething3(String input){
result = a.process(input);
}
}
我想要的是当多线程调用方法doSomeThing1()
或doSomeThing2()
,将在多线程之间使用并共享对象“ a”(必须是),并且一次只能处理一个输入(等待直到其他线程设置)对象“ a”免费),并在doSomeThing3
时立即处理输入。
我的问题是方法doSomeThing3()
会影响方法doSomeThing1()
和doSomeThing2()
? 如果doSomeThing1()
和doSomeThing2()
使用对象“ a”,是否需要等待?
方法永远不会受到线程执行的任何操作的影响。 受影响的是数据 ,问题的答案完全取决于a.process()
调用中更新的数据(如果有)。
您问“变量引用或内存被阻止?”
首先,“变量”和“内存”是同一回事。 变量,字段和对象都是基于“内存”的较低层概念构建的较高层抽象。
第二,否。锁定对象并不能阻止其他线程访问或修改该对象,也不能阻止其他线程访问或修改其他任何东西。
锁定对象有两件事:防止其他线程同时锁定同一对象,并且对内存更新的可见性做出某些保证。 简单的解释是,如果线程X更新了一些变量然后释放了锁,则线程Y将仅在获得相同的锁之后才能保证看到更新。
对于您的示例,这意味着,如果线程X调用doSomething1()并修改了对象a; 然后线程Y稍后调用doSomething3(),则不能保证线程Y会看到更新。 它可能会看到一个对象处于其原始状态,它可能会看到它处于完全更新的状态,或者它可能会看到某个无效的中途状态。 原因是,即使线程X锁定了该对象,也对其进行了修改,然后释放了该锁定; 线程Y从未锁定同一对象。
在您的代码中,doSomething3()可以与doSomething1()或doSomething2()并行进行,因此从某种意义上说,它可以满足您的需求。 但是,取决于a.process()的确切作用,这可能会导致争用条件和数据损坏。 请注意,即使已调用doSomething3(),已经开始的对doSomething1()或doSomething2()的任何调用都将继续; 在处理doSomething3()时,它们不会被搁置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.