gpt4 book ai didi

java - 同步保护不适用于双线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:06 24 4
gpt4 key购买 nike

下面是我精简的 Java 代码以供审查。我有几个子类,当调用 execParallel() 时,会启动一个新线程。此线程和默认线程都必须通过 actionFunction() 多次执行 criticalFunction(),但如果一次仅由一个进程执行,此函数将仅对给定的 SubClassC 连接正常工作。

我使用关键字“synchronized”来防止并发执行,但实际上 criticalFunction() 实际上被两个线程同时调用。

知道我做错了什么吗?

public class MainClass extends GlobalLibrary {
public static SubClassA masterObj;

public MainClass() {
masterObj = new SubClassA();
}
public static class SubClassA {
public SubClassB subObj1;
public SubClassB subObj2;
public SubClassA() {
subObj1 = new SubClassB();
subObj2 = new SubClassB();
}
}
public static class SubClassB {
public SubClassC conObj;
public Thread ut = null;
public SubClassB() {
conObj = new SubClassC();
}
}
public static class SubClassC {
public TCPMasterConnection con=null;
public SubClassC() {
con = new TCPMasterConnection();
}
public synchronized Object criticalFunction(int arg) {
return otherClass.executeCritical(con, arg);
}
}
public boolean actionFunction(SubClassB subObj, int arg) {
return (subObj.conObj.criticalFunction(arg)==null);
}

public class ActionThread implements Runnable {
public SubClassB subObj;
private int icode;
public ActionThread(SubClassB arg1, int arg2) {
subObj = arg1;
icode = arg2;
}
public void run() {
for (int i=0; i<10; i++) actionFunction(subObj, icode);
}
}
public void execParallel() {
masterObj.subObj1.ut = new Thread(new ActionThread(masterObj.subObj1, 1));
masterObj.subObj1.ut.start();

actionFunction(masterObj.subObj1, 2);
actionFunction(masterObj.subObj1, 3);
actionFunction(masterObj.subObj1, 4);
actionFunction(masterObj.subObj1, 5);
actionFunction(masterObj.subObj1, 6);
}
}

最佳答案

如果您的目标是保护 otherClass.executeCritical(con, arg)调用,那么你会想要锁定在 otherClass 的粒度实例。如果目标是在给定时间只有一个线程使用“主连接”,这似乎是您非常想要的,那么您需要将锁定粒度设置为 TCPMasterConnection 的实例。 .在后一种情况下,您的代码将如下所示:

    public Object criticalFunction(int arg) {
synchronized(con) {
return otherClass.executeCritical(con, arg);
}
}

现在如果你在 otherClass 中都有多线程不安全的代码和 con (TCPMasterConnection 的),你可能想要一个更大粒度的锁。在这种情况下,如其他答案中所述,锁定类(class)级别可能很容易。

关于java - 同步保护不适用于双线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679864/

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