Java 多线程同步使用
Java Multithreading synchronized usage
我对以下代码(在两个选项之间)的输出结果以及原因感到困惑:
根据我的理解,输出应该是 option1,因为使用了 synchronized 关键字。
输出选项:
- Java 线程 ThreadExample Java 多线程。
- 无法确定打印文本的顺序。
class ThreadDemo extends Thread
{
final StringBuffer sb1 = new StringBuffer();
final StringBuffer sb2 = new StringBuffer();
public static void main(String args[])
{
final ThreadDemo h = new ThreadDemo();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Java");
h.sb2.append("Thread");
System.out.println(h.sb1);
System.out.println(h.sb2);
}
}
}.start();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Mutithreading");
h.sb2.append("Example");
System.out.println(h.sb2);
System.out.println(h.sb1);
}
}
}.start(); }}
首先,无法确定哪个线程先于另一个线程 运行。所以你不能断言 "Java thread" 会先于 "Mutithreading Example"。它可能会发生,也可能不会。
其次,运行 方法上的同步关键字无关紧要,因为每个线程都锁定在自己的监视器上。因此,没有理由认为 "Java" 和 "thread" 必须一起打印,中间没有任何内容。它可能会发生,也可能不会。
这里重要的锁在 StringBuffers 和 stdout PrintStream 上。这些对象在它们的方法上使用同步,获取监视器并在方法调用期间保持它。这可以防止修改同一对象状态的并发调用相互干扰。
我对以下代码(在两个选项之间)的输出结果以及原因感到困惑: 根据我的理解,输出应该是 option1,因为使用了 synchronized 关键字。
输出选项:
- Java 线程 ThreadExample Java 多线程。
- 无法确定打印文本的顺序。
class ThreadDemo extends Thread
{
final StringBuffer sb1 = new StringBuffer();
final StringBuffer sb2 = new StringBuffer();
public static void main(String args[])
{
final ThreadDemo h = new ThreadDemo();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Java");
h.sb2.append("Thread");
System.out.println(h.sb1);
System.out.println(h.sb2);
}
}
}.start();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Mutithreading");
h.sb2.append("Example");
System.out.println(h.sb2);
System.out.println(h.sb1);
}
}
}.start(); }}
首先,无法确定哪个线程先于另一个线程 运行。所以你不能断言 "Java thread" 会先于 "Mutithreading Example"。它可能会发生,也可能不会。
其次,运行 方法上的同步关键字无关紧要,因为每个线程都锁定在自己的监视器上。因此,没有理由认为 "Java" 和 "thread" 必须一起打印,中间没有任何内容。它可能会发生,也可能不会。
这里重要的锁在 StringBuffers 和 stdout PrintStream 上。这些对象在它们的方法上使用同步,获取监视器并在方法调用期间保持它。这可以防止修改同一对象状态的并发调用相互干扰。