<Sound Dev> RFR: 8266421: Deadlock in Sound System

Alexander Zvegintsev azvegint at openjdk.java.net
Tue May 25 21:43:35 UTC 2021


On Tue, 25 May 2021 18:06:21 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:

>> src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java line 322:
>> 
>>> 320: 
>>> 321:         if (this.started != started) {
>>> 322:             this.started = started;
>> 
>>> I doubt that this type of synchronization may help something - the fields are volatile and we use sendEvents flag after synchronization block, so I removed it as well. Any thoughts?
>> 
>> These fields are volatile, but the comparison and assignment is not atomic.
>> So I believe it is possible the case when we will have `sendEvents == true` in two threads, hence we will send a duplicate event.
>> 
>> So we probably might want to use `AtomicBoolean` if you want to get rid of `synchronized`.
>
> It could make sense only if the "sendEvents" flag will be used under some kind of synchronization as well, otherwise, it is possible to get sendEvents=true twice, it was not changed after this fix:
> synchronized (this) {
>     if (this.started != started) {
>         this.started = started;
>         sendEvents = true;
>       }
> }
> <<< here the other thread could set "started" to the opposite state and we post events twice.
> if (sendEvents) {
> .....
> }

The case with setting opposite state you are describing is a different one. We will post two different events like start and stop.

I am talking about calling `setStarted()` with same parameter from different threads.

For example we have two threads T1 and T2 calling `setStarted(true)`.
Before the fix only one of thread will set `sendEvents` to `true` due to `synchronized` block.

After the fix following is possible:

// this.started  == false, started == true
if (this.started != started) { //T1 passed this check
    // <<<<< at this moment T2 checks the statement above
    this.started = started; // T1 and T2 assigns same new value to this.started
    sendEvents = true; // both threads sets sendEvents to true.
}
// sending two start events.

-------------

PR: https://git.openjdk.java.net/jdk/pull/4141


More information about the sound-dev mailing list