gpt4 book ai didi

java - 这些类是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-29 03:52:14 30 4
gpt4 key购买 nike

头等舱:

class Main1 {
private ExecutorService service = Executors.newFixedThreadPool(4);

public static void main(String[] args) {
Main1 m = new Main1();
m.start();
}

public void start() {
final MyObject obj = new MyObject();
obj.doSomeCalculation();// after this point not to modify obj in main thread

service.submit(new Runnable(){
public void run() {
obj.doSomething(); // is it threadsafe doing this?
}
});
}
}

第二类:

class Main2 {
private ExecutorService service = Executors.newFixedThreadPool(4);

public static void main(String[] args) {
Main2 m = new Main2();
m.start();
}

public void start() {
class Job implements Runnable {
public MyObject obj;

public void run() {
obj.doSomething(); // is it threadsafe doing this?
}
}

Job job = new Job();
job.obj.doSomeCalculation(); // after this point not to modify obj in main thread
service.submit(job);
}
}

Main1Main2 是线程安全的吗? Main1 和 Main2 对线程安全有不同的意义吗?

更新:doSomeCalulation() 和 doSomething() 都没有任何锁或同步块(synchronized block)。我想知道 doSomething() 是否总能读取 doSomeCalculation() 更改为 obj 的正确状态

最佳答案

Are Main1, Main2 threadsafe?

Main1 的情况下,应用程序的线程安全取决于 MyObject 是否是线程安全的以及是否有任何其他线程使用它进行操作。但是,obj.doSomething(); 语句是线程安全的,假设没有其他任何东西正在改变对象

事实上,obj.doSomething(); 语句不使用封闭类中的变量。相反,该变量的值在隐藏的构造函数参数中传递给内部类。使这个线程安全的另一件事是在创建新线程时父线程和子线程之间存在隐式同步。 (引用 - JLS 17.4.4 Synchronization Order)这两个事实结合起来意味着 Runnable.run() 方法将获得正确的引用,并且子线程将在同步点看到对象的状态(或以后)。

Main2 的情况下,同样适用。在这种情况下,您只是明确地(或多或少地)做了 Main1 情况下隐含发生的事情。

UPDATE - 即使您在将对象传递给子线程之前改变父线程中的对象(根据您更新的问题),上述推理也适用......因为隐式同步我提及。 (但是,如果父线程在调用 submit() 之后更改 MyObject,就会遇到线程安全问题。)

Does Main1 and Main2 make different sense?

我不知道你在问什么。如果您问使用内部类而不是匿名内部类是否有任何好处……在这种情况下,答案是否定的。它们在线程安全方面的行为相同。

实际上,Main1 版本更好,因为它更简单、更具可读性(对于有经验的 Java 开发人员而言)并且更健壮。 Main2 类公开了 obj 字段,供其他代码访问甚至更新。那是糟糕的风格。您可以解决这个问题,但只能通过添加更多代码……这让我们回到了简单性/可读性上。

关于java - 这些类是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8236627/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com