当使用非线程安全类时,可以创建多个对象并将其传递到每个线程中吗?

问题描述 投票:0回答:2

说我有一个不是线程安全的类A,并且我想用B类启动一堆线程,将一个A类的新实例传递给B类的每个线程是一个不错的设计选择,因为如果我通过一个所有人都将获得A类实例的并发问题?

@NotThreadSafe
class A {
...
}

class B extends Thread {
   private A a;

   B(A a) {
       this.a = a;
   }
}

class C {
    public static void main(String [] args) {
        for(int i = 0; i < 10; i++) {
            A a = new A();
            B b = new B(a);
            b.start();
        }
    }
}
java multithreading
2个回答
0
投票

这在很大程度上取决于A类的特性。

通常,通过创建每个线程A的实例将解决(不是解决,而是消除)并发问题。假设类A具有某种内部状态(否则类A本身应该是线程安全的),则每个线程B将读取/更新属于类A的“自己”对象的内存中的不同字段,因此,除非没有并发问题,否则除非...

  1. 一个非常“重”的对象,创建它会对性能/内存产生重大影响。
  2. 使用每个线程的对象设计将无法满足产品的功能要求。例如,您have在线程之间共享某些东西(东西=某种公共状态),因为如果一个线程B进行了一些工作并更新了该内部状态,则另一个线程B应该能够从(能够读取)该状态,否则它将再次执行该工作或执行错误。

0
投票

每次使用一个实例和一个新实例之间存在很大差异。 (例如,如果班级代表一个人,那么每次都是同一个人或不同人之间的差异。这使得程序结果因情况而异,因此这个问题没有意义。)

如果我们假设该类不包含任何数据,因此无论使用单个实例还是多个实例,程序结果都不会改变,然后

一个很好的设计选择,因为如果我将A类的一个实例传递给所有人其中会有并发问题

这将是一个糟糕的设计选择,并且不能解决任何并发问题,因为每个类实例所处理的外部数据将保持不变,并且线程将争夺数据。

要解决并发问题,必须使用同步。

© www.soinside.com 2019 - 2024. All rights reserved.