A deadlock occurs when transaction A locks a record then has to wait for transaction B to unlock a record, while transaction B is waiting on a record already locked by transaction A.
Oracle has a pretty sophisticated mechanism for handling changes to tables during the course of an update. See
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:11504247549852
Generally, the risk of a deadlock increases the longer a transaction runs and the more data a transaction changes. I'd say this is unlikely to deadlock, but is likely to 'queue' - if you have three or four concurrent sessions running this SQL, each session will have the same execution path for the SQL, will identify the same rows for update, one will get to them first, the others will wait. When that first transaction completes, another will re-grab the records, find they are changed, and restart as described in Tom Kyte's article and select the next bunch of rows.
If you are on 11g, there is a SKIP LOCKED you can use. It is present, but undocumented, in earlier versions. So there it would be USE AT YOUR OWN RISK.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF01702
In that way, you'd
SELECT primary_key BULK COLLECT INTO pk_variable_array FROM D_Q1
WHERE DQ1_BAT_ID is null
AND DCT_ID = in_contentType_id
AND ROWNUM < (in_work_size + 1)
FOR UPDATE SKIP LOCKED;
--
FORALL i in 1..pk_variable_array
UPDATE D_Q1
SET DQ1_BAT_ID = in_batch_id
WHERE primary_key = pk_variable_array(i)