我正在尝试同步一个字符串文字,以便我可以控制我的线程的执行但由于某些原因不起作用..
同步的方式有问题吗?
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);
}
}
答案 0 :(得分:1)
同步点是访问共享资源。您的线程应该在其他线程尝试访问的对象上获取监视器。在您的情况下,每个线程获取一个不同的对象的监视器,因此它们都不会阻塞。
如果您将文字"One"
传递给构造函数
first = new RunThread("One",orderedthread);
second = new RunThread("One",orderedthread);
third = new RunThread("One",orderedthread);
然后你会看到按顺序执行。每个线程都必须在另一个线程开始之前完成其for循环(在synchronized
块内)。这是因为每个线程在同一个String
对象上同步。
更好的是,使用其中一个充当锁的许多java.util.concurrent
类。例如,Lock
。