黑马程序员技术交流社区

标题: 同步代码块的问题! synchronized(xxx)! [打印本页]

作者: 余松霖    时间: 2011-12-17 10:25
标题: 同步代码块的问题! synchronized(xxx)!
本帖最后由 余松霖 于 2011-12-17 15:26 编辑


     synchronized(xxx)   需要用到同步代码块的时候.里边传的参数为什么要是个对象呢! 这个对象有什么意思!
作者: 小春同学    时间: 2011-12-17 10:38
这个对象相当于锁,有0和1这两个标志位,1表示可以进去,0表示不能进去!
作者: 余松霖    时间: 2011-12-17 11:02
熊明春 发表于 2011-12-17 10:38
这个对象相当于锁,有0和1这两个标志位,1表示可以进去,0表示不能进去!

这里边的要传的对象可以是随意的吗!     我看毕老师视频的时候他总是穿个object的对象
作者: 小春同学    时间: 2011-12-17 12:13
余松霖 发表于 2011-12-17 11:02
这里边的要传的对象可以是随意的吗!     我看毕老师视频的时候他总是穿个object的对象 ...

对,随意的,但如果同步的是方法,且这个方法是静态的,就只能用方法所在类的字节码文件,类名.class;
毕老师的多线程你还没看完吧,看完了多敲敲代码,你就明白了,我这些也是跟毕老师学的呀,
作者: 我心飞翔    时间: 2011-12-17 12:38
深入了解synchronized及对象锁
1 , Synchronized锁定的是对象而非函数或代码。2 , 每个Object只有一把锁(Lock)与之关联,当进行到Synchronized语句或函数的时候,这把锁就会被当前的线程(thread)拿走,其他的(thread)再去访问的时候拿不到锁就被暂停了3, 只有当Synchronized的是同一个对象的才是线程安全的(thread-safe)如:   1) public Synchronized void method1 : 锁住的是该对象,类的其中一个实例 , 当该对象(仅仅是这一个对象)在不同线程中执行这个同步方法时,线程之间会形成互斥.达到同步效果,但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁.   2)  Synchronized(this){ //TODO } 同一   3)  public Synchronizedstatic void method3 : 锁住的是该类,当所有该类的对象(多个对象)在不同线程中调用这个static 同步方法时,线程之间会形成互斥,达到同步效果 , 但如果多个线程同时调用method1 , method3,则不会引互斥,具体讲看最后讲解.   4) Synchronized(Test.class){ //TODo} 同三   5) synchronized(o) {} 这里面的o可以是一个任何Object对象或数组,并不一定是它本身对象或者类,谁拥有o这个锁,谁就能够操作该块程序代码.这里面1) 与2) 是线程安全的,但1)与3) , 2)与3) 他们所拥有的锁不一样,故不是同步的,不是线程安全的.

最后, synchronized 所同步的代码应该尽量少.如果没有必要同步的就不要列为其中    联想到数据库的并发控制假如有如下操作   1) 从数据库中读取数据   2) 修改数据   3) 提交数据解决方案一1) 读取数据synchronized(XXX){   2)修改数据   3) 提交数据}解决方案二synchronized(XXX){   1) 读取数据   2)修改数据   3) 提交数据}解决方案三synchronized(XXX){   3) 提交数据}这里面到底用哪一种方案视具体情况而定, 要注意的是synchronized(同步)的代价,开销是很大的.




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