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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一年之后 中级黑马   /  2013-12-16 19:02  /  1391 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一年之后 于 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() ;
  
}
}



评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

5 个回复

倒序浏览
不会,只是锁定synchronize所修饰的内容,他修饰谁,执行到此时就锁定修饰的内容,可能是对象,可能是方法
回复 使用道具 举报
jing迪 发表于 2013-12-16 22:05
不会,只是锁定synchronize所修饰的内容,他修饰谁,执行到此时就锁定修饰的内容,可能是对象,可能是方法 ...

我说的是如果new Window1() 就没了锁的效果,就可能打出0,或者-1
有锁的效果不应该是k=1的时候就结束了嘛。
回复 使用道具 举报
本帖最后由 张鹏 于 2013-12-17 00:18 编辑

虽然你传进去的是同一个w但这个w只是作为执行块
而this指当前对象,也就是线程对象,而不是w
this分别指代t1、t2、t3
回复 使用道具 举报
this所指的是当前类的对象,就是所用的锁是Ticket t = new Ticket() ;中的 t;只创建了一次,
当t1.star() ;t2.start() ;t3.start() ;它会调用三次run(), 但是锁是唯一的就是t;有一个进入,另外两个就会锁在外面.
但是你写new Ticket();因为 t1.start() ;t2.start() ;t3.start() ;它会调用三次run(),就相当于new了三次对象,
他们的锁是不同的,都可以进去,所以你锁不住的,

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

回复 使用道具 举报
belief丶Only 发表于 2013-12-17 02:23
this所指的是当前类的对象,就是所用的锁是Ticket t = new Ticket() ;中的 t;只创建了一次,
当t1.star() ;t2 ...

对对对。明白了。3q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马