黑马程序员技术交流社区

标题: 死锁同步的小疑惑! [打印本页]

作者: 赵家阳    时间: 2012-10-12 16:02
标题: 死锁同步的小疑惑!
本帖最后由 赵家阳 于 2012-10-15 23:32 编辑
  1. class Test2 implements Runnable
  2. {
  3. private boolean flag;
  4. Test2(boolean flag)
  5. {
  6. this.flag = flag;
  7. }
  8. public void run()
  9. {
  10. if(flag)
  11. {
  12. synchronized(MyLock1.locka)
  13. {
  14. System.out.println(Thread.currentThread().getName()+"----if locka");
  15. synchronized(MyLock1.lockb)
  16. {
  17. System.out.println(Thread.currentThread().getName()+"----if lockb");

  18. }
  19. }
  20. }else{
  21. synchronized(MyLock1.lockb)
  22. {
  23. System.out.println(Thread.currentThread().getName()+"----else lockb");
  24. synchronized(MyLock1.locka)
  25. {
  26. System.out.println(Thread.currentThread().getName()+"----else locka");

  27. }
  28. }
  29. }
  30. }
  31. }

  32. class MyLock1
  33. {
  34. /**
  35. * 为什么synchronized的参数是一个对象呢?
  36. */
  37. static Object locka = new Object();
  38. static Object lockb = new Object();

  39. }
  40. public class DeadLockTest1 {
  41. public static void main(String[] args)
  42. {
  43. Thread t1 = new Thread(new Test2(true));
  44. Thread t2 = new Thread(new Test2(false));
  45. t1.start();
  46. t2.start();
  47. }
  48. }
复制代码
synchronized的参数有时是this,有时可以为“类名.class”,有时还是一个对象,那么,synchronized的参数到底是怎样的?请高手详解!

作者: 李建强    时间: 2012-10-12 16:25
本帖最后由 李建强 于 2012-10-12 16:27 编辑

synchronized 是一个关键字,不是方法。
有两种用法:synchronized方法、synchronized代码块。
你就把那个对象当一个门
加上synchronized就相当于给门加了一把锁就行了。
作用是同一时刻最多一个线程执行这段代码。
this,类名.class这些都是对象。

至于更详细的,慢慢来,写多了看着也累。
作者: 曾浩    时间: 2012-10-12 16:28
本帖最后由 曾浩 于 2012-10-12 16:30 编辑

同步代码块时synchronized的参数是传入一个对象
同步一般函数时锁是this 但是this也是一个对象啊
同步静态方法时锁是  类名.class      类名.class  也是一个对象 他是 Class类型的对象
作者: 王乐    时间: 2012-10-13 13:40
首先要明确自己定义的同步的锁是什么,否则是无法应用的
当使用同步代码块的时候,synchronized的参数是可以自定义的。
当使用同步方法的时候如果被同步的方法是非静态的,那默认的synchronized的锁就是this(也就是说,如果你的代码中想要1个非静态方法和1个段码块实现同步的话。那先确定了调用他们的对象是同一对象后,在定义方法的时候声明了synchronized。  而在定义同步代码块的时候就应该设置参数为(this)。因为非静态方法synchronized的锁是this。  这样他们才能实现同步

静态方法同理。
作者: 刘 佳    时间: 2012-10-13 15:34
synchronized的参数有时是this,有时可以为“类名.class”,有时还是一个对象,那么,synchronized的参数到底是怎样的?

当在同步函数中时,synchronized的锁就是this,这个函数是指非静态函数。
当在静态同步函数中时,synchronized的锁是该类的字节码文件对象,即类名.class
在synchronized同步代码块中,这个锁是任意对象。

应该注意的是,构成同步成功的前提。  一是有两个或以上的线程。二是这些线程用的是同一把锁。




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