同步代码

时间:2013-02-12 19:06:34

标签: java multithreading synchronized

我在某处读过以下代码片段与同步代码相同:

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


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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

你的第一个方法隐含地抓住this上的锁,所以它与你的第二种方法相同。

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

答案 1 :(得分:1)

以上方法是相同的。一个线程不需要获取对象的锁来访问它的方法,除非它们用synchronized关键字标记 - ergo,所有其他线程将执行这些方法,即使有一个线程持有{{ 1}}锁定。