我可以调用一个同步方法调用一个调用同步方法的非同步方法吗?
Can I call a synchronized method that calls a non-synchronized method that calls a synchronized method?
在 Java 中,在单个对象和线程中全部使用同步关键字。
我可以调用一个同步方法调用一个调用同步方法的非同步方法,而没有最终同步方法阻塞第一个同步方法完成吗?
单对象单线程没问题。
你的唯一线程能够获得所有的锁,并且由于重入,它可以多次获得它们。
即使我们添加另一个线程,它也会工作(对一个对象)。一个线程将获取第一个锁,阻塞第二个线程,然后继续正常执行。
多线程多对象,答案是"it depends on how the code is written"。
如果一个class既有同步方法也有非同步方法,多个
线程仍然可以访问您拥有的 class 的非同步 methods.If
不访问您要保护的数据的方法,那么您就不会
需要同步它们。同步在某些情况下会导致命中(或
如果使用不当甚至死锁)
无论同步与否,您的代码始终可以调用方法。一个更好的问题是,当你的代码调用它时会发生什么。
同步方法如下所示:
synchronized void foobar() {
doSomething();
}
实际上只是一种简写方式:
void foobar() {
synchronized(this) {
doSomething();
}
}
所以关于调用同步方法的任何问题实际上都是关于执行同步块的问题。当您的代码输入 synchronized(this) {...}
.
时,可能会发生三件事
1) 如果this
对象没有加锁,那么它会被加锁在调用线程的名字中,线程会执行块中的语句,然后当它解锁的时候完成了。
2) 如果 this
对象已经被调用线程锁定,那么线程将简单地执行块中的语句。
3) 如果this
对象被某个other线程锁定,那么调用线程会一直等到另一个线程解锁它,然后再继续与情况 (1) 一样。
如果您的代码试图锁定两个 不同的 锁,唯一会惹上麻烦的方法。然后,如果您的设计没有经过深思熟虑,两个或更多线程可能会 死锁,您可以在其他地方阅读相关内容。
在 Java 中,在单个对象和线程中全部使用同步关键字。
我可以调用一个同步方法调用一个调用同步方法的非同步方法,而没有最终同步方法阻塞第一个同步方法完成吗?
单对象单线程没问题。
你的唯一线程能够获得所有的锁,并且由于重入,它可以多次获得它们。
即使我们添加另一个线程,它也会工作(对一个对象)。一个线程将获取第一个锁,阻塞第二个线程,然后继续正常执行。
多线程多对象,答案是"it depends on how the code is written"。
如果一个class既有同步方法也有非同步方法,多个 线程仍然可以访问您拥有的 class 的非同步 methods.If 不访问您要保护的数据的方法,那么您就不会 需要同步它们。同步在某些情况下会导致命中(或 如果使用不当甚至死锁)
无论同步与否,您的代码始终可以调用方法。一个更好的问题是,当你的代码调用它时会发生什么。
同步方法如下所示:
synchronized void foobar() {
doSomething();
}
实际上只是一种简写方式:
void foobar() {
synchronized(this) {
doSomething();
}
}
所以关于调用同步方法的任何问题实际上都是关于执行同步块的问题。当您的代码输入 synchronized(this) {...}
.
1) 如果this
对象没有加锁,那么它会被加锁在调用线程的名字中,线程会执行块中的语句,然后当它解锁的时候完成了。
2) 如果 this
对象已经被调用线程锁定,那么线程将简单地执行块中的语句。
3) 如果this
对象被某个other线程锁定,那么调用线程会一直等到另一个线程解锁它,然后再继续与情况 (1) 一样。
如果您的代码试图锁定两个 不同的 锁,唯一会惹上麻烦的方法。然后,如果您的设计没有经过深思熟虑,两个或更多线程可能会 死锁,您可以在其他地方阅读相关内容。