it’s not about mixing, because Swing is AWT extended. It’s about a better interpreted environment, that is to check for required capabilities (look for Capabilities in the JDK !).
For instance, VolatileImage are used to get instanced if and only if the VRAM buffer is activated for a specific config. You cannot change this property, or you may try the java2d forceVram JVM option. VolatileImage fetches for a memory allocation directly in the VRAM buffer. Say you have a 2D/3D accelerated graphics card in your pc-box, then VolatileImage is obviously a supported capability (Capabilites.isTrueVolatile() and you can use native codecs management, too).
So it is for VolatileImage, so on it is for BufferStrategy which features multi-buffer flipping. There are several options to check for before you launch your graphical environment. BTW a native Graphical Environment means that VRAM is fully used unlike a software Graphical Environment would use the shared memory buffer in your system RAM.
Hence understand that sharing memory for both graphics Threads and usual system Threads is very “tightened” for the System to constrain its resources (just have a look to your system resources usage if you’re in Win32 environment)!
E.g. for Applets, just try to put a VolatileImage entirely covering the background of your applet ! You’ll see that your buffer is sometimes reconstructed and that the background desapear or crashes somehow when invoking repaint() several times. Next time use a BufferedImage and you’ll certainly observe a better and smoother rendering !
To make a correct use of the VolatileImage, instance a Frame cover the background with the same VolatileImage and repaint() several times, no crashes should occur or your config doesn’t support it ! 