Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 当线程t2当前正在执行相同的函数时,线程t1能否调用函数“x.funcA()”?(爪哇)_Java_Multithreading_Synchronized - Fatal编程技术网

Java 当线程t2当前正在执行相同的函数时,线程t1能否调用函数“x.funcA()”?(爪哇)

Java 当线程t2当前正在执行相同的函数时,线程t1能否调用函数“x.funcA()”?(爪哇),java,multithreading,synchronized,Java,Multithreading,Synchronized,晚上好, 我对以下代码有两个问题 当线程t2当前正在执行f.funcA时,线程t1能否调用函数f.funcA? 当线程t2当前正在执行f.funcA时,线程t1能否调用函数f.funcB? 如果有人能解释为什么是或为什么不是,我会很高兴 public class Foo() { ... synchronized void funcA() {....} synchronized void funcB() {....} ... } Foo f = new Foo(); 提前感谢您的回答 有些人

晚上好,

我对以下代码有两个问题

当线程t2当前正在执行f.funcA时,线程t1能否调用函数f.funcA? 当线程t2当前正在执行f.funcA时,线程t1能否调用函数f.funcB? 如果有人能解释为什么是或为什么不是,我会很高兴

public class Foo() { 
...
synchronized void funcA() {....}
synchronized void funcB() {....}
...
}

Foo f = new Foo();
提前感谢您的回答


有些人认为这是家庭作业。。不是。每个对象实例都有一个锁。线程t2将持有f上的锁,并且在退出funcA之前不允许线程t1获取该锁

现在,如果funcA和funcB是静态类方法,那么就会有一个全局锁,在这种情况下,线程t1将无法获取该锁,直到线程t2退出funcA


对我来说,不清楚以下情况如何发生:

当x正在执行函数y.start时,它怎么会调用它呢

x没有执行任何操作。x是对具有数据和方法的对象的引用,例如x.start。方法属于对象,但它们是由线程执行的

如果某个线程t1执行上述代码片段,它将首先创建一个新的Foo,并在变量x中存储对它的引用。然后它将创建第二个实例,并在变量y中存储对该实例的引用。然后它将调用x.start,最后,在x.start返回后,它将调用y.start

如果第二个线程t2也在同一时间执行相同的代码段,那么t2将执行与t1完全相同的操作;如果变量x和y是局部变量,那么两个线程根本不会相互作用:每个线程都有自己的x和y

如果x或y是共享变量(例如,两个线程都知道的对象的静态变量或实例变量),事情会变得更复杂。当线程对共享变量进行操作时,您需要使用synchronized来防止它们相互干扰

其他信息:

如果类Foo扩展了线程呢

这使得start调用更有趣,但它并没有改变我上面所说的任何内容。执行代码段的线程仍将调用x.start,并且只有在返回之后才会调用y.start


不同之处在于,每个启动调用都将创建一个新线程,因此在代码段完成后,将有三个线程而不是一个线程在运行。这两个新线程不一定运行与第一个线程相同的代码段。它们中的每一个都将开始执行x.run或y.run,该方法的定义控制着新线程将执行的操作。

为什么不试试看呢?不是真的。这对于家庭作业来说太少了;。内森,谢谢。。那是个错误。同步是对公共内存的保护。在这种情况下,它会阻止类对象。。。我想是的。对不起。。那是个错误。只有f。谢谢你的回答。但是我有个问题。。基本上t1总是退出funcA,线程t2每次都可以执行它。。除了t2在funcA中调用funcA,或者?@David你的问题不清楚。我想您是在问单个线程是否可以递归调用同步方法。是的,它可以。Java的内在锁是可重入的,这意味着如果线程已经持有锁,它可以多次进入同步块,然后在退出这些块时,它会保留锁,直到离开它输入的第一个块;Foo y=新的Foo;x、 开始;y、 开始;。。当x正在执行函数y.start时,它怎么会调用它呢。。。y、 当x.start完成时执行start。。。程序不会在函数中间跳出,而是继续执行剩余的代码,同时执行未完成的函数。我希望你能理解我想说的话,这让我明白了。非常感谢。
Foo x = new Foo();
Foo y = new Foo();
x.start();
y.start();