在某些情况下,以下程序实际上会停止(因为线程2),但它不应该。为什么会发生这种情况?
线程1:基本上锁定全局变量并执行while循环。 线程2:尝试获取全局变量的锁,如果成功,则继续停止程序。
但是,线程1首先启动,所以从技术上讲,线程2永远不应该被调用,因此程序永远不应该退出。
线程1:基本上锁定全局变量并执行while循环。 线程2:尝试获取全局变量的锁,如果成功,则继续停止程序。
但是,线程1首先启动,所以从技术上讲,线程2永远不应该被调用,因此程序永远不应该退出。
static Integer global = 30;
public static synchronized void setVar(int x, String from)
{
System.out.println(global + " " + x + " - " + from);
global = x;
}
public static void main(String [] args)
{
Thread thr1 = new Thread(new Runnable()
{
@Override
public void run()
{
synchronized(global)
{
while(true)
{
setVar((int) (Math.random() * 30), "Thread 1");
}
}
}
});
Thread thr2 = new Thread(new Runnable()
{
@Override
public void run()
{
synchronized(global)
{
setVar((int) (Math.random() * 30), "Thread 2");
System.exit(0);
}
}
});
thr1.start();
thr2.start();
}
输出(我偶尔会得到的)
30 19 - 线程 2
0 < x < 29
。 - Mathew Kurian