说我有一个不是线程安全的类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();
}
}
}
这在很大程度上取决于A类的特性。
通常,通过创建每个线程A的实例将解决(不是解决,而是消除)并发问题。假设类A具有某种内部状态(否则类A本身应该是线程安全的),则每个线程B将读取/更新属于类A的“自己”对象的内存中的不同字段,因此,除非没有并发问题,否则除非...
每次使用一个实例和一个新实例之间存在很大差异。 (例如,如果班级代表一个人,那么每次都是同一个人或不同人之间的差异。这使得程序结果因情况而异,因此这个问题没有意义。)
如果我们假设该类不包含任何数据,因此无论使用单个实例还是多个实例,程序结果都不会改变,然后
一个很好的设计选择,因为如果我将A类的一个实例传递给所有人其中会有并发问题
这将是一个糟糕的设计选择,并且不能解决任何并发问题,因为每个类实例所处理的外部数据将保持不变,并且线程将争夺数据。
要解决并发问题,必须使用同步。