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有关
来个高手解释下
。。。。。
。。。。。
。。。。。
。。。。。