2010-07-08 148 views
1

我只是在玩Java中的线程。我有一个实现可运行的类。关于线程的问题

public class MyThread implements Runnable{ 

    private boolean finished; 
    //Other variables 

    public void run(){ 
     //Thread code 
    } 
} 

我的理解是,类型MyThread的每个线程都有自己的成员变量的副本,并写入这些成员变量,无需同步。这个假设是否正确?如果正确,访问什么需要同步?有人可以关心给大纲或伪代码。?谢谢。

回答

6

不一定。您可以使用相同的MyThread实例创建多个线程。例如:

MyThread x = new MyThread(); 
new Thread(x).start(); 
new Thread(x).start(); 
new Thread(x).start(); 

现在将有三个线程在同一个对象中运行代码。

我建议你重命名MyThread,因为它的不是一个线程 - 这是线程执行的任务。这使得它更清晰(IMO)。

+0

在这种情况下,所有三个线程(运行x)都看到*相同的*完成字段,所以如果在一个线程中更改了'finished',那么其他两个线程是否会看到更改?或者,这是'volatile'关键字会改变行为的例子吗? – 2010-07-08 07:43:20

+0

@Andreas_D:他们都将使用相同的字段,但没有易变的修饰符,他们可能看不到对方的变化。 – 2010-07-08 07:49:00

+0

接受。但这是否意味着如果线程在不同的实例上运行,什么都不需要同步?或者在相同类型的不同实例上运行的线程之间共享什么? – user378101 2010-07-08 07:52:25

0
  • 每个MyThread实例都是一个新的实例,就像普通的类和对象一样。
  • 复制本机类型的变量。这意味着在一个线程中更改变量对另一个线程不起作用。这些不必同步。
  • 对于其对象引用被复制。这意味着两个线程可能有一个对同一个对象的引用。如果两个线程同时操纵该对象,则可能会变差。因此,这些访问必须同步。
0

concurrency上真正的大指数线索非常值得一读(是的,它有例子)。