Java.lang Class - Programming

Q1:

What will be the output of the program?
public class Test 
{ 
    public static void main(String[] args) 
    {
        final StringBuffer a = new StringBuffer(); 
        final StringBuffer b = new StringBuffer(); 

        new Thread() 
        { 
            public void run() 
            {
                System.out.print(a.append('A')); 
                synchronized(b) 
                { 
                    System.out.print(b.append('B')); 
                } 
            } 
        }.start(); 
            
        new Thread() 
        {
            public void run() 
            {
                System.out.print(b.append('C')); 
                synchronized(a) 
                {
                    System.out.print(a.append('D')); 
                } 
            } 
        }.start(); 
    } 
}

A ACCBAD

B ABBCAD

C CDDACB

D Indeterminate output

ANS:A - ACCBAD

It gives different output while executing the same compiled code at different times.

C:\>javac Test.java
C:\>java Test
ABBCAD
C:\>java Test
ACADCB
C:\>java Test
ACBCBAD
C:\>java Test
ABBCAD
C:\>java Test
ACBCBAD
C:\>java Test
ACBCBAD
C:\>java Test
ABBCAD