Marek Laca created QPID-8510:
--------------------------------

             Summary: [Broker-J] Incorect use of volatile modifier for array
                 Key: QPID-8510
                 URL: https://issues.apache.org/jira/browse/QPID-8510
             Project: Qpid
          Issue Type: Bug
          Components: Broker-J
            Reporter: Marek Laca


Based on Java documentation a change of volatile variable is always visible to 
other threads. Hence, assignment a new array to the volatile variable 
guarantees the visibility of the new array to another threads, but there is not 
any guarantee of the visibility of a new element of the array. Because the 
insertion of a new element into the volatile array is a change of the internal 
state of the array.
 For example there is the method AMQPConnection_1_0Impl::removeTransaction:
{code:java}
    private volatile ServerTransaction[] _openTransactions = new 
ServerTransaction[16];

    @Override
    public void removeTransaction(final int txnId)
    {
        try
        {
            _openTransactions[txnId] = null; // There is not any  guarantee of 
the visibility, when the change is propagated to another threads.
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            throw new UnknownTransactionException(txnId);
        }
    }
{code}
The same issue is in other methods of AMQPConnection_1_0Impl class.

A concurrent collection can be used instead of the volatile array.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to