黑马程序员技术交流社区
标题:
线程的问题 解释一下 下面的代码 是不是同步
[打印本页]
作者:
442851994
时间:
2012-10-25 10:48
标题:
线程的问题 解释一下 下面的代码 是不是同步
本帖最后由 442851994 于 2012-11-1 18:18 编辑
class Test
{
synchronized static void sayHello3()
{
}
synchronized void getX(){}
}
作者:
李贺晓
时间:
2012-10-25 11:26
写错了,应该是 static synchronized void sayHello3(){}
作者:
李靖
时间:
2012-10-25 11:57
Public synchronized void methodAAA()
{
//….
}
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是 说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任 意调用这个被加了synchronized关键字的方法。
上边的示例代码等同于如下代码:
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
getX()获得的锁是实例对象的锁,而static synchronized 修饰的sayHello3()方法的锁,是该类的字节码,一个类的字节码只有一个,但是实例对象却有多个。所以对于对于不同的实例对象,多线程的sayHello3方法是同步的;但是getX()方法,对于多线程的不同对象,不能实现同步。
这个地方讲的同步很不错:http://www.blogjava.net/MEYE/articles/355593.html。
作者:
李连闯
时间:
2012-10-25 12:24
对于非静态方法来说,synchronized使用this作为同步锁,因为非静态的方法必须由实例对象来调用;
对于静态方法来说,synchronized使用类的字节码Class作为同步锁,因为静态的调用是可以不用类的实例对象的;
静态方法synchronized static void sayHello3(){ }
和非静态方法synchronized void getX(){}使用的不同的锁,所以是不能够进行同步的。
作者:
李连闯
时间:
2012-10-25 12:24
对于非静态方法来说,synchronized使用this作为同步锁,因为非静态的方法必须由实例对象来调用;
对于静态方法来说,synchronized使用类的字节码Class作为同步锁,因为静态的调用是可以不用类的实例对象的;
静态方法synchronized static void sayHello3(){ }
和非静态方法synchronized void getX(){}使用的不同的锁,所以是不能够进行同步的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2