黑马程序员技术交流社区

标题: synchronized修饰代码块的锁问题 [打印本页]

作者: qw无语    时间: 2013-11-21 00:14
标题: synchronized修饰代码块的锁问题
  1. public class Test2 {
  2. public static void main(String[] args) {
  3. Rabbit rabbitw = new Rabbit("小白兔");
  4. Rabbit rabbitg = new Rabbit("小灰兔");
  5. rabbitw.start();
  6. rabbitg.start();
  7. }
  8. }

  9. class Rabbit extends Thread {
  10. private static int i = 100;

  11. Rabbit(String s) {
  12. setName(s);// 线程名字
  13. }

  14. public void run() {
  15. while (i > 0) {
  16. synchronized (this) {
  17. System.out.println(this.getName() + "吃了1个,还有胡萝卜" + --i);
  18. }
  19. }
  20. }
  21. }
复制代码
synchronized (this) 这里的this.是指Rabbit这个类,还是new出来的Thread对象.
如果是Rabbit这个类,为什么可以调用getName().
如果不是,那2个多线程岂不是不同步?那怎么解决啊?

作者: @ne_pie尒ce    时间: 2013-11-21 01:00
Java关键字this只能用于方法方法体内,在方法中,需要引用该方法所属类的当前对象时候,直接用this。
也就是说this可以代表当前类的对象,并不是new出来的对象,只是作为了对象的引用。
this是指向对象自己。当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用
所以说这里是Rabbit这个类的对象在调用getName()。
因为this只指向一个类,所以它是唯一的,线程使用的就是同一把锁,也是同步的




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