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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余明辉 中级黑马   /  2012-8-1 21:19  /  2019 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为了线程的安全,我们经常会在一些代码块上加锁,一般加的锁,都是一个唯一的对象,但是在学习的过程中,发现有时候加的锁是.class类型,什么时候需要加这种锁呢?而且产生一个唯一的对象是非常容易的

5 个回复

倒序浏览
当函数为static修饰的时候,因为static比对象先存在的特点,那个时候加载类的时候,还没没有对象但是static方法已经加载,如果想获得锁,必须是.clas文件,因为那个时候,对象还不存在。
引用下···
静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名。class  该对象的类型是Class

静态的同步方法,使用的锁是该方法所在的类的字节码文件对象。 类名.class
回复 使用道具 举报
锁? 一般是只线程同步,异步,锁的作用就是使线程同步.
线程同步就是开启多个线程的时候如果加上同步锁就是每次只会执行一个线程,这样就不会出现多个线程同时运行.就比如:
两个人去银行取钱,一个使用卡在机器上取钱,一个使用存折在柜台取,这个时候如果使用线程同步锁就像晚上去1个atm取钱 就得一个先取 另一个在取.就是这个道理
回复 使用道具 举报
如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。
回复 使用道具 举报
谢谢你们的回答,使我恍然大悟,看来以后要多分析下内存,要站在内存的角度去看问题了
回复 使用道具 举报
版主来帮下忙吧,帖子改不了“已解决”,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马