java多线程问题 多核cpu遇上java多线程,求解释

 

java多线程问题 多核cpu遇上java多线程,求解释,代码如下:

 

主机win7 i5双核4线程cpu,虚拟机xp单核,下面代码主机和虚拟机跑得结果差太远了,
主机运行结果和预期不一样,虚拟机却和预计一样

class ThreadDemo1
{
 public static void main(String [] args)
 {
    TestThread tt = new TestThread();
  new Thread(tt).start();
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  tt.str = new String("method");
  new Thread(tt).start();
 }
}

class TestThread implements Runnable//*/extends Thread//两种线程方式 继承和实现接口
{//runnable适合多个线程处理同一个资源
 int tickets = 100;
 String str = new String("");
 public void run()

 { 
  if(str.equals("method"))
  {
   while(true)
   {
    sale();
   }
  }
  else
  { 
   while(true)
    {
     synchronized(this)//用str时不能同步

     {

      if(tickets > 0)
      {
       try
       {
        Thread.sleep(10);//暂停10毫秒
       }
       catch(Exception e)
       {
        e.printStackTrace();
       }
       System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
      }
     }
    }
  }
 }
 public synchronized void sale()//同步函数
 {
  if(tickets > 0)
    {
     try
     { 
      Thread.sleep(10);//暂停10毫秒
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
     System.out.print("sale(): ");
     System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
    }
 }
}

 

主机运行结果,sale方法根本就没有被执行!

 

 

虚拟机运行结果:达到预期的同步代码块和同步函数的同步结果

 

求解释!就高手解释!

此代码源于张孝祥的java视频,在我机子上运行结果和他视频上的运行结果不一样,却和虚拟机的貌似一样。。

 

 

 

网上看到如下某些解释:

关键问题在于,你无法预测每个cpu的时间片分配。所以,要得到你想要的输出结果就属于随机事件了。  对与多核cpu 上的程序同步问题,最好不要用信号量,互斥量,事件对象,因为它们都属于内核对象,都是对一个cpu而言的。其他的cpu根本不会理睬你设置的这些东西。

 

 

是不是里面的监视器this的问题呀。。。

 

经过实验,用上面的代码进行分别用this 和str作为监视器实现死锁时,主机不出现思索,虚拟机却出现死锁,看来真的跟多核和this有关

 

来个高手解释下

。。。。。
。。。。。
。。。。。
。。。。。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值