While an exclusive lock may exist, it may not necessarily be the direct culprit.
The "hung" session may be in enqueue wait.
===============================================
select object_name, do.object_id, session_id, serial#, osuser, username, locked_mode , start_time, module
from dba_objects do, v$session, v$locked_object lo, v$transaction
where to_date(start_time,'MM/DD/YY HH24:MI

S') < (sysdate-(1/1440))
and locked_mode in (3,5,6)
and session_id = sid
and saddr = ses_addr
and lo.object_id = do.object_id
order by start_time desc
/
=============================================
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request
/
================================================== ======
One of hese two queries might provide more visibility into the situation.