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)。考虑到上述代码样本,这究竟是如何工作的?
答案 0 :(得分:4)
尝试增加50到1000000,可能那么他们会吗?
线程1在其时隙结束之前完成执行,因此没有上下文切换。
或者......,如果你每次迭代都会添加Thread.sleep
,你可能会发现它们是交错的。
答案 1 :(得分:0)
线程旨在尽可能独立运行。如果你想调用交错,你可以使用一个循环来调用每个线程。
你应该假设你的线程可以在任何时候开始和停止,除非你控制它们。出于性能原因,通常最好只放置最少的控件,否则最终会得到一个更复杂,更慢,更快的解决方案,这通常是使用线程的重点。