两个线程可以在同一时间点运行两种不同的方法吗?

Kal*_*osh 7 java multithreading

class A {
    private synchronized f() {
        ...
        ...
    }

    private void g() {
        ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果线程T1正在运行同步的f(),那么线程t2可以运行g(),它在同一时间点不同步,而T1仍在运行f()吗?

wil*_*ood 16

不在同一个A实例上.实例本身就是锁,所以两个方法同时执行两个方法,两个线程需要两个A实例.

  • @James - 一切都是为了保护共享状态.如果多个线程可以同时访问一个类中的方法,那么状态将根本不受保护,这将是毫无意义的.一次一个线程男孩. (2认同)
  • @James,你可能想阅读http://www.artima.com/underthehood/threadP.html.我将引用以下内容 - "当JVM解析对方法的符号引用时,它确定方法是否同步.如果是,则JVM在调用方法之前获取锁.对于实例方法,JVM获取与调用该方法的对象关联的锁.对于类方法,它获取与该方法所属的类关联的锁. (2认同)

rea*_*ler 6

是.两种方法都可以在同一个实例上同时执行.

只是f()同步.线程必须获取this.f()要执行的监视器,f()并且每个实例只存在一个监视器.

g()如果没有同步,则运行该方法不需要监视器锁定,因此任何线程都可以随时执行g().

"同步方法在执行之前获取监视器(第17.1节)."

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.3.6