-1

我正在尝试同步一个字符串文字,以便我可以控制我的线程的执行,但由于某种原因它不起作用..

它的同步方式有什么问题吗?

package scratch1;

public class OrderedThread {
    public static void main(String[] args){
        RunThread first, second, third;
        OrderedThread orderedthread = new OrderedThread();
        first = new RunThread("One",orderedthread);
        second = new RunThread("Two",orderedthread);
        third = new RunThread("Three",orderedthread);
        second.start();
        first.start();
        third.start();
    }

    public void display(String msg){
        synchronized(msg){
            for (int i = 1; i <= 20; i++){
                System.out.println("Name = "+ msg);
            }
        }
    }

}

class RunThread extends Thread{
    String name;
    OrderedThread orderT;
    RunThread(String name, OrderedThread orderT){
        this.name = name;
        this.orderT = orderT;
    }

    public void run(){
        orderT.display(name);
    }
}
4

1 回答 1

1

同步点是访问共享资源。您的线程应该获取其他线程试图访问的对象上的监视器。在您的情况下,每个线程都获取不同对象的监视器,因此它们都不会阻塞。

相反,如果您将文字传递"One"给构造函数

first = new RunThread("One",orderedthread);
second = new RunThread("One",orderedthread);
third = new RunThread("One",orderedthread);

然后你会看到按顺序执行。每个线程都必须synchronized在另一个线程开始之前完成其 for 循环(在块内)。这是因为每个线程都在同一个String对象上同步。

java.util.concurrent更好的是,使用其中一个作为锁的许多类。例如,Lock

于 2013-10-03T18:37:28.973 回答