Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Thread Safety - Fatal编程技术网

Java 从非线程安全类实例化线程安全类

Java 从非线程安全类实例化线程安全类,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,在非线程安全的类中,必须避免使用类变量,因为它们可以由不同的线程端执行上下文共享。 但是,如果实例化一个本身具有类变量的外部类,这些类是否是线程安全的 在本例中,线程之间共享计数器变量是否存在风险 class MyNotThreadSafeClass() { private integer sharedvariable; public void callAnOtherClass() { myClass o = new myClass(); System.

在非线程安全的类中,必须避免使用类变量,因为它们可以由不同的线程端执行上下文共享。 但是,如果实例化一个本身具有类变量的外部类,这些类是否是线程安全的

在本例中,线程之间共享计数器变量是否存在风险

class MyNotThreadSafeClass()
{
   private integer sharedvariable;
   public void callAnOtherClass()
   {
      myClass o = new myClass();
      System.out.println(o.increment(counter));
   }
}

class myClass()
{
   private integer counter;
   public void increment() { return(counter++); }  
}

如果您有什么想法,谢谢您(本线程安全主题中的文档不是很清楚)

这是有效的,因为您从未将
o
传递给另一个线程。因此,任何其他线程都无法访问此实例

一般的模式是:如果在多个线程之间共享一个实例,那么需要进行某种同步


如果您不共享一个实例,那么是否有更多线程并不重要。

您的代码包含许多错误。一个类是线程安全的还是非线程安全的,并不取决于它是如何实例化的。你的myClass示例不适合你的问题,它没有类变量。它也没有显式地显示任何线程。非常感谢你的快速回答M.Digulla。