Understanding the Behavior of Transactional Memory Applications