public class Mutex {
private int val;
public Mutex(int val) {
this.val=val;
}
public int getVal() {
return val;
}
public void printVal()
{
int i=0;
while (true)
{
System.out.println(Thread.currentThread().getName()+" "+this.getVal());
if(i==50)
break;
else
i++;
}
}
public static void main(String args[])
{
final Mutex m1=new Mutex(1);
final Mutex m2 = new Mutex(2);
new Thread(new Runnable()
{
@Override
public void run() {
m1.printVal();
}
},"THREAD-1").start();
new Thread(new Runnable()
{
@Override
public void run() {
m2.printVal();
}
},"THREAD-2").start();
}
}
當「val」是「int」類型時,THREAD-1和THREAD-2不交織,而如果我將其類型改爲double,則線程交織。我知道原語是線程安全的(除了long和double)。考慮到上述代碼示例,這個工作到底如何?爲什麼THREAD-1和THREAD-2不交錯?
當我運行此代碼時,無論數據類型如何,我都會看到交織。 – 2013-04-23 10:48:25
printVal()太快,以致於無法確定它是否甚至需要交錯,以便循環50次。做得更多,然後嘗試。 – Ankit 2013-04-23 10:52:06
使用System.nanoTime()來查看線程執行* work *所花費的時間。也許在如此短的時間內不會使上下文切換。線程實驗的有用時間至少從一毫秒開始。 – 2013-04-23 11:02:25