Regarding logical locking of rows:
0. PMON iswaking every 3 secs, but only every 20 wakeup it checks for dead sessions. On unix folks advise to kill the dead process unders consideration with kill cmd and then PMON will clear it quite soon...

1. dbms_lock can be used to have non-transactional locks, but I think they will not be released faster than is_session_alive returns session is not alive.

2. I quess that your users are not scattered all arround a world, but sit in one control room. If this is the case, then they can found out that application crashed and use FORCE UNLOCK feature (which has to be coded)

3. if point 2 is not OK, then consider to implement checking of dead client: kind of whatchdog.
In a simple form it could be client application's timer generating eg. dbms_alerts every 15 secs or so. In case a long query is running or so, the v$sesion status = active can be checked before deciding on action.