Hi, Jay.
I think we should drive device update through 
GraphicsEnvironment.displayChanged() and DisplayChangeListener instead of force 
updating bounds in GraphicsDevice.displayChanged in the constructor.
We can synchronise the GraphicsEnvironment.displayChanged() by calling it under 
CGraphicsEnvironment.initDevices() sync lock, this will force call 
DisplayChangeListener when devices are updated.

Unfortunately, we cannot move the "displayChanged()" method under the lock,
because this method will notify all DisplayChangedListener which might use some
other locks, so we will have  GraphicsEnvironment.sync->SomeOther locks order,
and at the same time, some other thread may acquired SomeOther lock and tried to
call CGraphicsEnvironment.getScreenDevices(), so we will get
SomeOther->CGraphicsEnvironment.sync and this will cause a deadlock.


--
Best regards, Sergey.

Reply via email to