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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官仁杰 中级黑马   /  2012-10-18 02:25  /  1588 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官仁杰 于 2012-10-18 16:22 编辑

Object obj = new Object();
synchronized(obj){。。。}
想不太明白,改变锁的值到底是改变这个类的哪个量?随便哪个对象都能当锁吗?选择锁的时候有什么原则吗?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
视频中改变锁的值只是一种理解方式,你可以随便假象有那么一个变量。
随便哪个对象都能当锁,但是你程序中必须要保证锁的唯一,也就是对象是同一个。
选择锁的原则:首先必须要保证锁是同一个,然后就是尽量用已有的对象,没必要增加代码冗余量

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
任何对象都可以当锁,必须保持锁的唯一性,确保对象唯一。
回复 使用道具 举报
通过 synchronized关键字来声明synchronized 块。 synchronized(syncObject ) {   //允许访问控制的代码   }   
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (可以是类实例或类)的锁方能执行,由于可以针对任意代码块,且可任意指定上锁的对象
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。   
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。(不管有多少个线程,都必须等正在用的线程把该方法走完了,其他的线程才可以依次调用)   
当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。   
当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。   

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

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