Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于线程的问题_Java_Synchronization - Fatal编程技术网

Java 关于线程的问题

Java 关于线程的问题,java,synchronization,Java,Synchronization,我只是在玩java中的线程。我有一个实现runnable的类 public class MyThread implements Runnable{ private boolean finished; //Other variables public void run(){ //Thread code } } 我的理解是,MyThread类型的每个线程都有自己的成员变量副本,对这些成员变量的写入不需要同步。这个假设正确吗?如果正确,访问需要同步的内容?有人

我只是在玩java中的线程。我有一个实现runnable的类

public class MyThread implements Runnable{

   private boolean finished;
   //Other variables

   public void run(){
      //Thread code
   }
}
我的理解是,MyThread类型的每个线程都有自己的成员变量副本,对这些成员变量的写入不需要同步。这个假设正确吗?如果正确,访问需要同步的内容?有人愿意给出一个大纲或伪代码吗。?谢谢。

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

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

          MyThread x = new MyThread();
          new Thread(x).start();
          new Thread(x).start();
          new Thread(x).start();
          
          现在将有三个线程都在同一个对象中运行代码


          我建议您重新命名MyThread,因为它不是一个线程,而是一个线程要执行的任务。这就更清楚了(国际海事组织)。

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

          MyThread x = new MyThread();
          new Thread(x).start();
          new Thread(x).start();
          new Thread(x).start();
          
          现在将有三个线程都在同一个对象中运行代码


          我建议您重新命名MyThread,因为它不是一个线程,而是一个线程要执行的任务。这就更清楚了(IMO)。

          真正大的索引线索非常值得一读(是的,它有一些例子)

          真正大的索引线索非常值得一读(是的,它有一些例子)

          在这种情况下,所有三个线程(运行x)是否都看到相同的finished字段,因此如果一个线程中的
          finished
          发生了更改,那么其他两个线程是否看到了更改?或者这是一个例子,
          volatile
          关键字会改变行为吗?@Andreas\u D:他们都会使用相同的字段,但如果没有volatile修饰符,他们可能看不到彼此的变化。接受。但这是否意味着如果线程在不同的实例上运行,就不需要同步任何东西?或者,在同一类型的不同实例上运行的线程之间究竟共享了什么?是的,如果它们在不同的实例上运行并且使用完全不同的值(例如,没有对共享的其他对象的引用),则应该可以。在这种情况下,所有三个线程(运行x)是否都看到相同的完成字段,因此,如果一个线程中的
          finished
          发生了更改,那么其他两个线程是否看到了更改?或者这是一个例子,
          volatile
          关键字会改变行为吗?@Andreas\u D:他们都会使用相同的字段,但如果没有volatile修饰符,他们可能看不到彼此的变化。接受。但这是否意味着如果线程在不同的实例上运行,就不需要同步任何东西?或者,在同一类型的不同实例上运行的线程之间究竟共享了什么?是的,如果它们在不同的实例上运行,并且使用完全不同的值(例如,没有对共享的其他对象的引用),则应该可以。