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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-8-23 22:06  /  1894 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket implements Runnable
{
private int tick=1000;  --------------------------------(2).
Object obj=new Object();
boolean flag=true;
public void run()
{
  if(flag)
  {
   while(true)
   {
    synchronized(obj)  // -------------------(1)  
   {
     if(tick>0)
     {
      try
      {
       Thread.sleep(10);
      }
      catch (Exception e)
      {
      System.out.println("执行");
      }
      System.out.println(Thread.currentThread().getName()+"....code...."tick--);
     }
    }
   }
  }
  else
   while(true)
   show();  //2.那么这是静态方法怎样调用的呢?
}
public synchronized void show()  -------------------------------------------(3)
{
  if(tick>0)
  {
   try{Thread.sleep(10);}catch(Exception e){}
   System.out.println(Thread.currentThread().getName()+"....show...."+tick--);
  }
}
}
class TicketDemo3
{
public static void main(String[] args)
{
  Ticket t=new Ticket();
  Thread t1=new Thread(t);
  Thread t2=new Thread(t);
  t1.start();
  try{Thread.sleep(10);}catch(Exception e){}
  t.flag;
  t2.start();
}
}




为什么会打印0?
而如果在(1)处的括号里面改成this就行
而如果把(2)和(3)语句加上static则会出错,而把(1)处换成Ticket.class为什么可以?
详解

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

2 个回复

倒序浏览
哥们。
为什么会打印0?
而如果在(1)处的括号里面改成this就行?
因为,不是统一的对象锁, t1的对象锁是object,而t2的对象所是this
而如果把(2)和(3)语句加上static则会出错,而把(1)处换成Ticket.class为什么可以?
如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
已解决   谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马