为什么THREAD-1和THREAD-2不交错?

时间:2013-04-23 10:42:04

标签: java multithreading

    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)。考虑到上述代码样本,这究竟是如何工作的?

2 个答案:

答案 0 :(得分:4)

尝试增加50到1000000,可能那么他们会吗?
线程1在其时隙结束之前完成执行,因此没有上下文切换。

或者......,如果你每次迭代都会添加Thread.sleep,你可能会发现它们是交错的。

答案 1 :(得分:0)

线程旨在尽可能独立运行。如果你想调用交错,你可以使用一个循环来调用每个线程。

你应该假设你的线程可以在任何时候开始和停止,除非你控制它们。出于性能原因,通常最好只放置最少的控件,否则最终会得到一个更复杂,更慢,更快的解决方案,这通常是使用线程的重点。