最近在看多线程,一直对synchronized(this)不是太理解,先上代码,
public class Letter extends Thread
{
int nbf;
CharacterString caracter;
String letter;
public Letter(int n,CharacterString c,String l)
{
nbf=n;
caracter=c;
letter=l;
}
public void run()
{
for (int i=0;i<10;i++)
{
synchronized(caracter)//this
{
for(int j=0; j<nbf;j++)
{
caracter.add(letter);
}
caracter.add("_");
}
Thread.yield();
try{sleep(1000);}
catch(InterruptedException e)
{e.printStackTrace();}
}
}
}
主程序是
public class Main
{
public static void main(String[] args)
{
CharacterString ch=new CharacterString();
Letter lta=new Letter(5, ch,"a");
Letter ltb=new Letter(3, ch,"b");
lta.start();
ltb.start();
}
}
另一个类CharacterString.java是
public class CharacterString
{
private String caracter;
public CharacterString ()
{
caracter=" ";
}
public void add(String a)
{
caracter+=a;
System.out.print(a);
}
}
如果synchronized(caracter),输出的结果是:aaaaa_bbb_aaaaa_bbb_aaaaa_bbb_aaaaa_bbb_aaaaa_bbb_
如果synchronized(this),输出的结果是:aaaaa_bbb_bbab_aaaa_bbb_aaaaa_aaaaa_bbb_abbaba_aa_abaabab_a_
说明synchronized(this)并没有锁住线程!
我的问题就是为什么synchronized(caracter)能锁住线程而synchronized(this)会出问题??
------解决方案--------------------
synchronized(object)表示请求获得object的锁
caracter对象是两个线程共用的(都是new CharacterString()创建的),a线程获得后b线程只能等待
this对象表示自己,由于继承了Thread,两个线程的this当然不是同一个对象,即请求的不是同一个锁,相互不影响
synchronized(this)一般不用于Thread或其子类中,没什么实际意义