使代码线程安全

时间:2017-09-22 01:54:02

标签: java multithreading thread-safety callable

我正在尝试查看此代码是否是线程安全的。

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对象对于不同的线程是不同的。我假设它是线程安全的。

0 个答案:

没有答案