【发布时间】:2015-01-30 10:04:21
【问题描述】:
我很困惑何时在多线程应用程序中使用Thread.join() 以及何时使用synchronization。
据我说,它们都阻塞或等待其他线程完成执行。
此示例必须依次输出 10 个 A、10 个 B 和 10 个 C,例如:
1 : A
2 : A
3 : A
4 : A
5 : A
6 : A
7 : A
8 : A
9 : A
10 : A
1 : B
2 : B
3 : B
4 : B
5 : B
6 : B
7 : B
8 : B
9 : B
10 : B
1 : C
2 : C
3 : C
4 : C
5 : C
6 : C
7 : C
8 : C
9 : C
10 : C
----ProGraM ENDS----
示例从这里开始
class SyncTest extends Thread
{
StringBuffer sb;
public SyncTest(StringBuffer sb)
{
this.sb = sb;
}
public void run()
{
synchronized(sb)
{
for(int i=1;i<=10;i++){
System.out.println(i+" : "+sb.charAt(0));
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));
}
}
public static void main(String [] args) throws InterruptedException
{
StringBuffer sb = new StringBuffer("A");
Thread t1=new SyncTest(sb);
Thread t2=new SyncTest(sb);
Thread t3=new SyncTest(sb);
t1.start();
t2.start();
t3.start();
Thread.sleep(1000);
System.out.println("----ProGraM ENDS----");
}
}
在这里,输出结果是 10 个 A,然后是 10 个 B,然后是 10 个 C,按顺序排列。但我也可以使用 Thread.join 而不是 synchronized 块来获得相同的输出,如下所示:
public void run()
{
//removed synchronized statement...
for(int i=1;i<=10;i++){
System.out.println(i+" : "+sb.charAt(0));
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));
}
public static void main(String [] args) throws InterruptedException
{
StringBuffer sb = new StringBuffer("A");
Thread t1=new SyncTest(sb);
Thread t2=new SyncTest(sb);
Thread t3=new SyncTest(sb);
t1.start();
t1.join();
t2.start(); // wait for t1 to complete
t2.join();
t3.start(); // wait for t2 to complete
t3.join();
// wait for t3 to complete
System.out.println("----ProGraM ENDS----");
}
谁能消除我对这两种技术使用的困惑,即何时在 Java 的多线程中使用 Thread.join 以及何时使用 synchronization。
【问题讨论】:
-
不要将
synchronized视为等待任何事情。synchronized的目的是防止不同的线程同时弄乱相同的数据。如果必须,它会等待,但这总是不太理想的结果:在完美的世界中,永远不会争用锁。另一方面,当我们调用join()时,那是因为我们想要 等待。当 B 完成之前 A 无能为力时,线程 A 调用 B.join()。
标签: java multithreading thread-synchronization