我正在尝试查看此代码是否是线程安全的。
private void eventProcessing(final AcEvent acEvent){
String tree = null;
String symbol = null;
try {
if(acEvent.isDatafileTransaction()){
final AcEventDatafileTransaction datafileTransaction = acEvent.getDatafileTransaction();
tree = datafileTransaction.getTreeId();
symbol = datafileTransaction.getSymbol();
System.out.println(tree, symbol);
}
}
我是否需要在 AcEvent 或 ACEventDatafileTransaction 中同步方法。这两个类只有你在代码中看到的 get 方法。我想不管线程的数量,在访问树和符号的正确值时都没有问题。我可以说这段代码是线程安全的,还是我需要进行任何更改以使其线程安全?
我将事件处理放在Callable
中threadpool.submit(new Callable<Integer>(){
public Integer call() throws Exception{
eventProcessing(event);
}
});
编辑: 这些是我在事件处理中编写的两行之后的行。
final List<AcStreamAble> transactions = getDatafileTransactions(datafileTransaction);
final List<AcEventRecordOperation> recordOperations = getTransactionsAsListOfRecordOperations(datafileTransaction, transactions);
我正在添加下一个方法。告诉我这是否会改变任何事情。
private List<AcEventRecordOperation> getTransactionsAsListOfRecordOperations(final AcEventDatafileTransaction datafileTransaction, final List transactions) {
final List <AcEventRecordOperation> recordOperations = new ArrayList<AcEventRecordOperation>(transactions.size());
int i = 0;
for (final Object o : transactions) {
if (!datafileTransaction.isRecordOperation(o)) {
log.debug( "[" + i + "] Ignored transaction - was not a RecordOperation" );
} else {
recordOperations.add(datafileTransaction.convert(o));
}
}
return recordOperations;
}
在上面的方法中,即使有一个列表,也会添加对象。我在想,因为它是一个内部变量,它将是线程安全的。
private List<AcStreamAble> getDatafileTransactions(final AcEventDatafileTransaction datafileTransaction) throws IOException {
final List<AcStreamAble> transactions = new ArrayList<AcStreamAble>();
datafileTransaction.addTransactions(transactions);
return transactions;
}
这里因为datafileTransaction对象对于不同的线程是不同的。我假设它是线程安全的。