>また、StringBufferで同様にメソッドに送りappendした場合、ちゃんと元の変数にも影響がありました。
じゃあこれはどうなる?

class ThreadA extends Thread{
private StringBuffer buff=null;
public ThreadA(StringBuffer buff){this.buff=buff;}
public void run(){
try{for(int i=0;i<100;i++){
buff.append("A"+i);
Thread.sleep(100);}}
catch(InterruptedException e){}}}
class ThreadB extends Thread{
private StringBuffer buff=null;
public ThreadB(StringBuffer buff){this.buff=buff;}
public void run(){
try{for(int i=0;i<100;i++){
buff.append("B"+i);
Thread.sleep(100);}}
catch(InterruptedException e){}}}

public class Main{
public static void main(String[] args)throws Exception{
StringBuffer buff=new StringBuffer();
Thread a=new ThreadA(buff);
Thread b=new ThreadB(buff);
a.start();
b.start();
a.join();
b.join();
System.out.println(buff.toString());
}
}