There might be a straightforward for this issue, but I am not understanding the concept here.
I am trying a simple program where I am having 3 threads executing a synchronized block to print letter in an incrementing order.The synchronized block is having lock on the variable(which is a StringBuffer object). Below is the code:
public class SimpleThread extends Thread implements Runnable{
    private StringBuffer myBuffer;
    public StringBuffer getMyBuffer() {
        return myBuffer;
    }
    public void setMyBuffer(StringBuffer myBuffer) {
        this.myBuffer = myBuffer;
    }
    public SimpleThread(StringBuffer myBuffer) {
        this.myBuffer = myBuffer;
    }
    public void run() {
        synchronized (this.myBuffer) {
            while((int)(this.myBuffer.charAt(0))!=68) {
                for(int i=0;i<3;i++) {
                    System.out.println(this.myBuffer.charAt(0));
                }
                char x = this.myBuffer.charAt(0);
                this.myBuffer.setCharAt(0, (char) (x+1));
            }
            //this.myBuffer.setCharAt(0, 'A');
        }
    }
    public static void main(String[] args) {
        StringBuffer safeBuffer = new StringBuffer();
        safeBuffer.append('A');
        SimpleThread one = new SimpleThread(safeBuffer);
        one.setName("One");
        one.start();
        SimpleThread two = new SimpleThread(safeBuffer);
        two.setName("Two");
        two.start();
        SimpleThread three = new SimpleThread(safeBuffer);
        three.setName("Three");
        three.start();
    }
Output for the program is:
A
A
A
B
B
B
C
C
C
It is only printing the value when thread One is executing and for other two threads, the of variable myBuffer is becoming D. What I don't understand is why changing the variable for one object reflect for other objects?
 
     
    