可以将多个线程输入InsertDAO吗?

赢得

我有一个调用MyService类的execute方法的Client类。该方法将依次调用InsertDAO类。此InsertDAO的状态带有实例变量。仅从MyService类的execute方法调用此方法。不能直接调用InsertDAO类。

我没有创建任何线程,但是我的App Server可能会在Client类上创建线程。现在,我想了解这将如何影响InsertDAO类。

  1. 多个线程可以同时访问InsertDAO的对象吗?-是/否
  2. 当在Client类上生成线程时,会将MyService类的相同实例分配给Client上的所有线程。然后,每个线程都应调用MyService的“ execute”方法。这意味着每个线程都有其自己的InsertDAO实例(我正在MyService类的execute方法内创建InsertDAO对象)。如果是这样,则多个线程不能同时进入InsertDAO。我的理解正确吗?
  3. 多个线程如何进入MyService.execute()-如果是这样,请进行一些解释。
  4. 多个线程如何进入InsertDAO类?-如果是真的,请做一些解释。
  5. 如何在不影响性能的情况下使其具有线程安全性?

专家,请分享您的想法。下面是我的代码。

//code starts here
public class Client{
    public void performExecution(){
        InvoiceVO createInvoiceVO = new InvoiceVO();
        MyService service = new MyService();
            createInvoiceVO = service.execute(createInvoiceVO);
        //retrieve successful/failure information from createInvoiceVO
    }
}

public class MyService{
    public InvoiceVO execute(InvoiceVO createInvoiceVO){
        InsertDAO insertDAO = new InsertDAO();
            insertDAO.process(createInvoiceVO);
    }
}

public class InsertDAO{
    private List<LineItem> lineItemsList = new ArrayList<LineItem>();
    private List<TaxVO> taxVOList = new ArrayList<TaxVO>();
    private Connection connection = null;

    public InvoiceVO process(InvoiceVO createInvoiceVO){
        this.lineItemsList = createInvoiceVO.getLineItemsList();
        this.taxVOList = createInvoiceVO.getTaxVOList();

        connection = getConnection();
        //insert tax vo objects
        insertTaxVOObjects(taxVOList);

        //insert line items
        insertLineItems(this.lineItemsList);

        //commit operation

        //close connection
        closeConnection();
    }

    private void insertTaxVOObjects(List<TaxVO> taxVOList){
        //code to insert TaxVO objects  
    }

    private void insertLineItems(List<LineItem> lineItemsList){
        //code to insert LineItem objects
    }

    private void getConnection(){
        //code to return connection
    }

    private void closeConnection(){
        //code to close connection
    }
}
djna

您不是在问正确的问题,线程没有输入类,而是输入了对象。我们需要查看对象的生命周期以及创建线程的时间。

现在,我不了解您的执行环境-我不清楚在何处创建线程,但是我假设将以某种方式创建客户端对象,并且每个对象的performExecution()方法都可以在其自己的线程上运行。现在的问题是,是否可以从两个线程同时访问您的InsertDAO对象中的任何一个,还是两个InsertDAO对象可能共享某些数据,因此两个线程可能会相互干扰。

现在首先我们注意到每个InsertDAO对象是单独的,它们具有变量,但是这些变量不是静态的。你有例如

this.lineItemsList

因此,数据由单个对象实例拥有,其他任何对象(可能在另一个线程中)都看不到附加到此对象的数据请注意,如果您拥有静态数据,则所有实例都可以看到它,并且会遇到问题。第一条规则:无静态数据,除非您通过同步访问对其进行保护。

您可能会遇到问题的一个地方就是要求建立连接。现在,通常将连接池化,我们真的不想为每个请求打开连接,而是从池中获得一个连接,并在使用该连接时返回。整个想法是线程共享同一池。因此,这里的一般原则是,您的InsertDAO对象使用的任何没有作为成员变量的对象都必须是线程安全的,也就是说,作者必须已经编写了它,以期望有多个线程对其进行访问。共享池:作者必须使用某种同步访问。规则2:查看您使用的内容以及您自己的代码。

最后一点,两个线程可以共享一个InsertDAO对象吗?要回答该问题,请查看如何创建它们:

public InvoiceVO execute(InvoiceVO createInvoiceVO){
    InsertDAO insertDAO = new InsertDAO();
        insertDAO.process(createInvoiceVO);
}

在这里,您创建对象,调用它的方法并返回(隐式释放该对象),其他线程都看不到,它在您的堆栈上是本地的。因此,我们知道只有一个线程使用一个InsertDAO对象。规则三:由调用方确定可以看到一个对象有多少线程。在您的情况下,您已确保一个线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用PipedStreams将数据从一个线程发送到多个线程吗?

来自分类Dev

我可以将多个表单输入绑定到bean的一个属性吗?

来自分类Dev

我可以将多个表单输入绑定到bean的一个属性吗?

来自分类Dev

python线程可以将状态发送回主线程吗

来自分类Dev

多个线程可以获取同一锁吗?

来自分类Dev

您可以从多个线程使用Android Trace类吗?

来自分类Dev

可以同时从多个线程调用单例对象的方法吗?

来自分类Dev

TPL可以在多个线程上运行任务吗?

来自分类Dev

Rust闭包可以被多个线程使用吗?

来自分类Dev

多个线程可以同时访问共享内存吗?

来自分类Dev

多个线程可以读取相同的类成员变量吗?

来自分类Dev

可以使单线程程序使用多个内核吗?

来自分类Dev

我可以从多个线程同时使用 VkDevice 吗?

来自分类Dev

输入表单属性可以指定多个表单ID吗?或不?

来自分类Dev

我可以从地图中返回多个对并输入哈希值吗?

来自分类Dev

我可以在PHP的多个输入中设置值吗?

来自分类Dev

您可以循环输入()来存储多个变量吗?

来自分类Dev

输入表单属性可以指定多个表单ID吗?或不?

来自分类Dev

awk 可以同时读取多个输入文件吗?

来自分类Dev

我可以依靠操作系统将线程调度为“最佳”线程吗(并行化)

来自分类Dev

您可以将文本输入更改为textarea吗?

来自分类Dev

我可以将徽章放入引导输入吗?

来自分类Dev

可以将输入类型“数字”用于任意精度的小数吗?

来自分类Dev

MATLAB Coder可以生成将指针作为输入的函数吗?

来自分类Dev

可以/应该将NSSheets用于文本字段输入吗?

来自分类Dev

我可以将徽章放入引导输入吗?

来自分类Dev

可以输入UUID吗?

来自分类Dev

Java system.in可以在不使用线程的情况下与输入源代码同时工作吗

来自分类Dev

可以将标准用于跨多个内核的并发分析吗?

Related 相关文章

  1. 1

    我可以使用PipedStreams将数据从一个线程发送到多个线程吗?

  2. 2

    我可以将多个表单输入绑定到bean的一个属性吗?

  3. 3

    我可以将多个表单输入绑定到bean的一个属性吗?

  4. 4

    python线程可以将状态发送回主线程吗

  5. 5

    多个线程可以获取同一锁吗?

  6. 6

    您可以从多个线程使用Android Trace类吗?

  7. 7

    可以同时从多个线程调用单例对象的方法吗?

  8. 8

    TPL可以在多个线程上运行任务吗?

  9. 9

    Rust闭包可以被多个线程使用吗?

  10. 10

    多个线程可以同时访问共享内存吗?

  11. 11

    多个线程可以读取相同的类成员变量吗?

  12. 12

    可以使单线程程序使用多个内核吗?

  13. 13

    我可以从多个线程同时使用 VkDevice 吗?

  14. 14

    输入表单属性可以指定多个表单ID吗?或不?

  15. 15

    我可以从地图中返回多个对并输入哈希值吗?

  16. 16

    我可以在PHP的多个输入中设置值吗?

  17. 17

    您可以循环输入()来存储多个变量吗?

  18. 18

    输入表单属性可以指定多个表单ID吗?或不?

  19. 19

    awk 可以同时读取多个输入文件吗?

  20. 20

    我可以依靠操作系统将线程调度为“最佳”线程吗(并行化)

  21. 21

    您可以将文本输入更改为textarea吗?

  22. 22

    我可以将徽章放入引导输入吗?

  23. 23

    可以将输入类型“数字”用于任意精度的小数吗?

  24. 24

    MATLAB Coder可以生成将指针作为输入的函数吗?

  25. 25

    可以/应该将NSSheets用于文本字段输入吗?

  26. 26

    我可以将徽章放入引导输入吗?

  27. 27

    可以输入UUID吗?

  28. 28

    Java system.in可以在不使用线程的情况下与输入源代码同时工作吗

  29. 29

    可以将标准用于跨多个内核的并发分析吗?

热门标签

归档