0

我在某处读到以下代码片段在同步代码方面是等效的:

public synchronized void printMsg() {
    System.out.println("synchronized");
}


public void printMsg() {
    synchronized(this) {
        System.out.println("synchronized");
    }
}

据我所知,当线程访问对象上的同步方法时,其非同步方法不会被锁定,即其他线程可以使用相同的实例访问它们。

观察第二个片段,我的印象是,由于代码是同步的this,因此访问该代码的线程会获取对象上的锁。

我的问题是,当 ThraedprintMsg()使用第二个代码片段维护执行方法的锁时,其他线程是否可以访问其他类方法?

如果不是,则上述方法并不完全相同。什么是真的?

4

2 回答 2

2

您的第一种方法隐式地抓住了锁,this因此它与您的第二种方法相同。

在方法体中未同步或同步的任何其他方法this都不会尝试锁定对象,并且可以由其他线程并发运行。

于 2013-02-12T19:13:22.347 回答
1

以上方法均等。一个线程不需要在对象上获取锁来访问它的方法,除非它们被标记为 synchronized 关键字 - ergo,即使有一个线程持有synchronized (this)锁,所有其他线程也会执行这些方法。

于 2013-02-12T19:19:38.573 回答