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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NO? 中级黑马   /  2014-3-29 08:00  /  1144 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

synchronized()所用的锁对象到底怎么确定啊 。头都大了,请各位高手指教啊?谢谢谢谢




12 个回复

倒序浏览
任意对象就行了。多个线程的锁对象都是要用同一个锁对象。
回复 使用道具 举报
使用synchronized()包含起来的是多线程的要执行的同步代码块,但是要有一个表示,那就是你所说的对象,如果没有对象,那同步代码块就达不到线程安全,也就是说在同一时刻可以有多个线程同时访问同步代码块,加上锁对象,那么当一个线程执行到synchronized的时,并得到此对象时,则可以执行synchronized里面的代码,同时将对象锁设置为不可访问状态,就算cpu切换到其他线程,其他线程没有同步锁,所以也没有执行同步代码块的权利
synchronized里面的对象可以是任意对象,但是必须是同一个对象

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
synchronized(),可以形象的看做一个带有门锁的房子。我们想要进取这个房子必须先开锁吧,但是你开锁不能乱开(不能开其他房门的锁,必须打开该扇门的锁)。所以synchronized()的锁其实就是用到了synchronized()里面内容的对象----既与之对应的锁。因此,如果是一个一般的方法的话,锁就是调用该方法的对象,也就是this了。如果是静态方法的话,(静态方法一加载就会进类存,我们调用静态方法都是   类名.静态方法名 ( ) )所以对应的锁就是调用该静态方法的类所对应的字节码文件对象了-------也就是类名.class。
希望对你有帮助

点评

很全面,赞一个!  发表于 2014-3-30 20:15

评分

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

查看全部评分

回复 使用道具 举报
在多线程中使用synchronized()的时候一定要注意  有可能出现死锁。死锁一般是
synchronized()里面再嵌套了一个锁,并且这两个synchronized()用的不是同一个锁。
例如:
if(true){
synchronized(锁a){

synchronized(锁b){
}
}
}else{

synchronized(锁b){

synchronized(锁a){
}

}
因为每一个synchronized()的锁所对应的“钥匙”只有一把所以当  第一个线程已经拿到a锁又想将if里面的内容运行完就必须拿到b锁。可惜的是另一个线程恰好拿到了b锁又想去拿a锁运行else里面的内容。这样 两个线程分别独立拿到了不同的锁确又想要对方手里的锁去运行程序-----这时就出现了死锁了。
因此,用同步的时候要特别小心以防止死锁的出现。

评分

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

查看全部评分

回复 使用道具 举报 1 0
默认是this 如果是静态的那就是对应的字节码文件 同步函数的锁是this 自己指定的锁可以是任意对象 但是要保证的同一个锁对象才能达到互斥的效果

评分

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

查看全部评分

回复 使用道具 举报
NO? 中级黑马 2014-3-29 19:29:55
7#
海世山盟 发表于 2014-3-29 12:47
在多线程中使用synchronized()的时候一定要注意  有可能出现死锁。死锁一般是
synchronized()里面再嵌 ...

真心感谢。祝你早日考上黑马。
回复 使用道具 举报
死锁是在多线程使用同一资源时出现的,我们要避免写死锁程序。
回复 使用道具 举报
这个问题我觉得你看一下毕向东老师关于线程讲解的视频你就知道怎么避免了 要是你认真看的话
回复 使用道具 举报
这个你的看资源,这资源在某一时刻只能一个调用,如果多个同时用就会出错的话,那就把这个资源锁上、、、上锁的目的就是让他在某一时刻只能被一个人调用。。。以免发生混乱,导致错误
回复 使用道具 举报
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马