A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dangfei 中级黑马   /  2012-2-23 08:55  /  1998 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类锁跟对象锁有什么区别具体怎么用,特别不明白对象锁概念。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 明白了?

查看全部评分

3 个回复

正序浏览
对象锁&类锁:

对象锁
当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放
同步静态方法/静态变量互斥体
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只由一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。一旦一个静态变量被作为synchronized block的mutex。进入此同步区域时,都要先获得此静态变量的对象锁
类锁
由上述同步静态方法引申出一个概念,那就是类锁。其实系统中并不存在什么类锁。当一个同步静态方法被调用时,系统获取的其实就是代表该类的类对象的对象锁
在程序中获取类锁
可以尝试用以下方式获取类锁
synchronized (xxx.class) {...}
synchronized (Class.forName("xxx")) {...}
同时获取2类锁
同时获取类锁和对象锁是允许的,并不会产生任何问题,但使用类锁时一定要注意,一旦产生类锁的嵌套获取的话,就会产生死锁,因为每个class在内存中都只能生成一个Class实例对象。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
当一个对象中有synchronized method 或者synchronized block的时候,调用该对象的同步方法或者进入该对象的的同步区时,就必须获得该对象锁。当该对象锁已被其他调用者占用,就必须等待其被释放。由于一个class无论被实例化多少次,其中的静态方法和静态变量在内存中只存在一份。所以一旦一个静态方法被声明为锁时,次类所有的实例化对象在调用此方法,共用一把锁。这就是类锁。一旦一个静态变量成为同步区时,在进入时就要先获得其对象锁。其实系统并不存在什么类锁,当一个同步静态方法被调用时,系统获取的其实就是代表该类的类对象的对象锁。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
如果同步函数被静态修饰,用类锁。静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
synchronized(对象)
{
        需要被同步的代码

}
对象如同锁。持有锁的线程可以在同步中执行,没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马