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

4

2 回答 2

4

尝试将50增加到1000000,也许他们会?
线程 1 在其时隙结束之前执行完毕,因此没有上下文切换。

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

于 2013-04-23T10:50:30.697 回答
0

线程被设计为尽可能独立运行。如果您想交错调用,您将使用一个循环调用每个线程。

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

于 2013-04-23T10:57:15.393 回答