我很困惑,因为Java的同步概念。
让我们假设下面的类:
class MyClass {
public synchronized void foo() { //do something }
public void bar() {
synchronized(this) { //do something }
}
public void normal() { //do something }
}据我所知,foo和bar方法的工作原理是一样的。
但是,在线程A进入bar方法并通过synchronized(this)同步实例之后,任何线程都能调用正常的方法吗?
据我所知,一些线程可以调用普通方法,而不需要调用foo方法。但是我不确定何时调用bar方法,因为它同步了一个实例。
另外,让我们假设以下方法:
class StaticMyClass {
public static synchronized void fooStatic() { //do something }
publi static void barStatic() {
synchronized(StaticMyClass.class) { //do something }
}
public static void normalStatic() { //do something }
}在这里,也有同样的问题。当线程A进入关键部分(即synchronized(StaticMyClass.class)或fooStatic方法)后,任何线程都能调用normalStatic吗?
我认为fooStatic和normalStatic可以单独调用,但是barStatic和normalStatic不能。如果它是错误的,为什么?
谢谢你的帮助。
编辑:
我的困惑之处是,我不确定synchronized(this)是否与synchronized(myClassInstance)相同。
MyClass my = new MyClass();
synchronized(my) {
//do something, Any other thread can't access my.normal(), is it right?
}
class MyClass {
public synchronized void foo() { //do something }
public void bar() {
synchronized(this) {
//do something, isn't this same as above synchronized(my)?
}
}
public void normal() { //do something }
}发布于 2018-09-02 00:44:05
如果不指定谁是监视器,则使用实例方法,监视器是实例(this),使用静态方法,监视器是类(YourClass.class)。
这段代码
public synchronized void foo() { //do something }它和这个一样
public void foo() {
synchronized(this) { //do something }
}这段代码
public static synchronized void fooStatic() { //do something }是一样的
public static void fooStatic() {
synchronized(StaticMyClass.class) { //do something }
}因此,在这两种情况下,foo和bar都是依赖的(同时只有一个线程),而法线可以独立调用。
发布于 2018-09-02 00:47:36
但是在线程A进入bar方法并通过同步(This)同步实例之后,任何线程都可以调用正常的方法吗?
在同一个对象上对同步方法进行两次调用是不可能的。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(挂起执行),直到第一个线程与该对象一起完成为止。
如果您试图调用其他不同步的方法,那么这是可能的。
当线程A进入同步(StaticMyClass.class)或fooStatic方法的关键部分后,任何线程可以调用normalStatic吗?我想,调用fooStatic和normalStatic可以独立调用,但是barStatic和normalStatic不能。如果它是错误的,为什么?
没有同步的其他方法可以独立调用,但是当您调用barStatic()时,不可能调用其他方法,因为您正在同步整个类。其他线程,必须等到当前线程完成执行。
https://stackoverflow.com/questions/52133130
复制相似问题