黑马程序员技术交流社区

标题: 同步代码块中锁的问题。 [打印本页]

作者: 一年之后    时间: 2013-12-16 19:02
标题: 同步代码块中锁的问题。
本帖最后由 一年之后 于 2013-12-17 09:32 编辑
  1. <div class="quote"><blockquote>当同步代码块中传入的对象,我用this就可以锁住
  2. 用new Window1()就没有锁的效果。
  3. 他俩不都是代表的本类的对象嘛。为什么会出现不同的结果。
复制代码

class Window1 implements Runnable // 定义一个类,实现Runnable
{
private static int k = 100 ;
Ticket t = new Ticket() ;
public void run(){    //覆盖run()方法
  
  while(true)
  {
   synchronized(this){  //同步代码块
    if(k>0){
     try{Thread.sleep(10) ;}catch(Exception e){}
     System.out.println(Thread.currentThread().getName()+"售出第"+k--+"张票") ;  
     //当 实现Runnable接口的时候,就不能用this.getName()来获取线程的名字。
    }
   }
  }
}
}
class ThreadTest1
{
public static void main(String[] args)
{
  Window1 w = new Window1() ;
  Thread t1 = new Thread(w) ;  //通过Thread类建立线程对象,把Window1类的对象,传给Thread的构造函数
  Thread t2 = new Thread(w) ;
  Thread t3 = new Thread(w) ;
  t1.start() ; // 开启线程。调用Window1中的run()方法
  t2.start() ;
  t3.start() ;
  
}
}




作者: jing迪    时间: 2013-12-16 22:05
不会,只是锁定synchronize所修饰的内容,他修饰谁,执行到此时就锁定修饰的内容,可能是对象,可能是方法
作者: 一年之后    时间: 2013-12-16 23:37
jing迪 发表于 2013-12-16 22:05
不会,只是锁定synchronize所修饰的内容,他修饰谁,执行到此时就锁定修饰的内容,可能是对象,可能是方法 ...

我说的是如果new Window1() 就没了锁的效果,就可能打出0,或者-1
有锁的效果不应该是k=1的时候就结束了嘛。

作者: 张鹏    时间: 2013-12-17 00:14
本帖最后由 张鹏 于 2013-12-17 00:18 编辑

虽然你传进去的是同一个w但这个w只是作为执行块
而this指当前对象,也就是线程对象,而不是w
this分别指代t1、t2、t3

作者: belief丶Only    时间: 2013-12-17 02:23
this所指的是当前类的对象,就是所用的锁是Ticket t = new Ticket() ;中的 t;只创建了一次,
当t1.star() ;t2.start() ;t3.start() ;它会调用三次run(), 但是锁是唯一的就是t;有一个进入,另外两个就会锁在外面.
但是你写new Ticket();因为 t1.start() ;t2.start() ;t3.start() ;它会调用三次run(),就相当于new了三次对象,
他们的锁是不同的,都可以进去,所以你锁不住的,
作者: 一年之后    时间: 2013-12-17 09:32
belief丶Only 发表于 2013-12-17 02:23
this所指的是当前类的对象,就是所用的锁是Ticket t = new Ticket() ;中的 t;只创建了一次,
当t1.star() ;t2 ...

对对对。明白了。3q




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