我有一个调用MyService类的execute方法的Client类。该方法将依次调用InsertDAO类。此InsertDAO的状态带有实例变量。仅从MyService类的execute方法调用此方法。不能直接调用InsertDAO类。
我没有创建任何线程,但是我的App Server可能会在Client类上创建线程。现在,我想了解这将如何影响InsertDAO类。
专家,请分享您的想法。下面是我的代码。
//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
}
}
您不是在问正确的问题,线程没有输入类,而是输入了对象。我们需要查看对象的生命周期以及创建线程的时间。
现在,我不了解您的执行环境-我不清楚在何处创建线程,但是我假设将以某种方式创建客户端对象,并且每个对象的performExecution()方法都可以在其自己的线程上运行。现在的问题是,是否可以从两个线程同时访问您的InsertDAO对象中的任何一个,还是两个InsertDAO对象可能共享某些数据,因此两个线程可能会相互干扰。
现在首先我们注意到每个InsertDAO对象是单独的,它们具有变量,但是这些变量不是静态的。你有例如
this.lineItemsList
因此,数据由单个对象实例拥有,其他任何对象(可能在另一个线程中)都看不到附加到此对象的数据。请注意,如果您拥有静态数据,则所有实例都可以看到它,并且会遇到问题。第一条规则:无静态数据,除非您通过同步访问对其进行保护。
您可能会遇到问题的一个地方就是要求建立连接。现在,通常将连接池化,我们真的不想为每个请求打开连接,而是从池中获得一个连接,并在使用该连接时返回。整个想法是线程共享同一池。因此,这里的一般原则是,您的InsertDAO对象使用的任何没有作为成员变量的对象都必须是线程安全的,也就是说,作者必须已经编写了它,以期望有多个线程对其进行访问。共享池:作者必须使用某种同步访问。规则2:查看您使用的内容以及您自己的代码。
最后一点,两个线程可以共享一个InsertDAO对象吗?要回答该问题,请查看如何创建它们:
public InvoiceVO execute(InvoiceVO createInvoiceVO){
InsertDAO insertDAO = new InsertDAO();
insertDAO.process(createInvoiceVO);
}
在这里,您创建对象,调用它的方法并返回(隐式释放该对象),其他线程都看不到,它在您的堆栈上是本地的。因此,我们知道只有一个线程使用一个InsertDAO对象。规则三:由调用方确定可以看到一个对象有多少线程。在您的情况下,您已确保一个线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句