我在某处读过以下代码片段与同步代码相同:
public synchronized void printMsg() {
System.out.println("synchronized");
}
public void printMsg() {
synchronized(this) {
System.out.println("synchronized");
}
}
据我所知,当Thread访问Object上的synchronized方法时,其非同步方法不会被锁定,即其他Thread可以使用相同的实例访问它们。
观察第二个片段,我的印象是,由于代码在this
上同步,访问该代码的线程获取对象的锁定。
我的问题是,当Thraed使用第二个代码片段维护锁定方法printMsg()
时,其他线程是否可以访问其他类方法?
如果不是,则上述方法并不完全相同。什么是真的?
答案 0 :(得分:2)
你的第一个方法隐含地抓住this
上的锁,所以它与你的第二种方法相同。
在方法体中this
未同步或同步的任何其他方法不会尝试锁定对象,并且可以由其他线程并发运行。
答案 1 :(得分:1)
以上方法是相同的。一个线程不需要获取对象的锁来访问它的方法,除非它们用synchronized关键字标记 - ergo,所有其他线程将执行这些方法,即使有一个线程持有{{ 1}}锁定。