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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2012-10-12 16:02  /  2027 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵家阳 于 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的参数到底是怎样的?请高手详解!

4 个回复

倒序浏览
本帖最后由 李建强 于 2012-10-12 16:27 编辑

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

至于更详细的,慢慢来,写多了看着也累。

评分

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

查看全部评分

回复 使用道具 举报
首先要明确自己定义的同步的锁是什么,否则是无法应用的
当使用同步代码块的时候,synchronized的参数是可以自定义的。
当使用同步方法的时候如果被同步的方法是非静态的,那默认的synchronized的锁就是this(也就是说,如果你的代码中想要1个非静态方法和1个段码块实现同步的话。那先确定了调用他们的对象是同一对象后,在定义方法的时候声明了synchronized。  而在定义同步代码块的时候就应该设置参数为(this)。因为非静态方法synchronized的锁是this。  这样他们才能实现同步

静态方法同理。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 曾浩 于 2012-10-12 16:30 编辑

同步代码块时synchronized的参数是传入一个对象
同步一般函数时锁是this 但是this也是一个对象啊
同步静态方法时锁是  类名.class      类名.class  也是一个对象 他是 Class类型的对象

评分

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

查看全部评分

回复 使用道具 举报
synchronized的参数有时是this,有时可以为“类名.class”,有时还是一个对象,那么,synchronized的参数到底是怎样的?

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

应该注意的是,构成同步成功的前提。  一是有两个或以上的线程。二是这些线程用的是同一把锁。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马