黑马程序员技术交流社区

标题: 关于线程同步的锁 [打印本页]

作者: 官仁杰    时间: 2012-10-18 02:25
标题: 关于线程同步的锁
本帖最后由 官仁杰 于 2012-10-18 16:22 编辑

Object obj = new Object();
synchronized(obj){。。。}
想不太明白,改变锁的值到底是改变这个类的哪个量?随便哪个对象都能当锁吗?选择锁的时候有什么原则吗?
作者: 郑世光    时间: 2012-10-18 07:34
视频中改变锁的值只是一种理解方式,你可以随便假象有那么一个变量。
随便哪个对象都能当锁,但是你程序中必须要保证锁的唯一,也就是对象是同一个。
选择锁的原则:首先必须要保证锁是同一个,然后就是尽量用已有的对象,没必要增加代码冗余量
作者: 丁旭    时间: 2012-10-18 07:44
任何对象都可以当锁,必须保持锁的唯一性,确保对象唯一。
作者: 李贺晓    时间: 2012-10-18 09:00
通过 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对象所有同步代码部分的访问都被暂时阻塞。   
作者: 官仁杰    时间: 2012-10-18 17:19
感谢诸位的回复




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2