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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈浩 中级黑马   /  2013-4-8 23:54  /  1564 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

synchronized(obj)  中的OBJ到底是什么东西啊?为什么随便一个东西都可以当做锁呢?完成锁定的原理?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 王杰123 于 2013-4-9 00:08 编辑

黑马之星王杰说出我的理解咱们共同进步,我认为是这样的 Object obj = new Object();  Object是根类,是所有对象的祖宗。所以随便一个对象就可以。锁的原理就是 一把锁有个开关,当线程进去就锁住,线程执行完就开锁,接着让下个线程进去执行。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Object  obj=new Object();
  obj 是一个对象,  还有 不是随便什么都可以当做锁的
synchronized(obj)     这的锁只能是一个对象,也可以是一个类的字节码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你可以直接用synchronized来修饰一个方法,如:public void synchronized printXX(){
........
}
这样,只在一个线和进个方法,那么此 “类”(方法所在的类) 就会被"上锁",其它线程不能访问。直到这个线程释放资源为止。
还可以将要实现同步的代码写到一个synchronized块里面,如:synchronized(obj){
......
}
注意,此处的obj是一个对象,你可以Object obj = new Object(); 也可以用this来代替,表示当前对象!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
其实是一个对象的两种状态
建议使用lock  jdk1.5新特效
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
明白啦   小弟谢谢各位回答
回复 使用道具 举报
本帖最后由 蓝色骨头 于 2013-4-9 21:56 编辑

1 obj就是任意一个对象

2 在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的
为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁
监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的那个特别的房间叫做"获得监视器",占据房间叫做"持有监视器",离开房间叫做"释放监视器",离开建筑叫做"退出监视器".   

监视器:monitor
锁:lock(JVM里只有一种独占方式的lock)
进入监视器:entermonitor
离开/释放监视器:leavemonitor
(entermonitor和leavemonitor是JVM的指令)
拥有者:owner
在JVM里,monitor就是实现lock的方式。
entermonitor就是获得某个对象的lock(owner是当前线程)
leavemonitor就是释放某个对象的lock

锁涉及到原子操作,比如两个线程都在获取一个锁,只能有一个得到锁,这在计算机里面只能是一条指令(单独一条的指令不能被中断)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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