当前位置: 代码迷 >> Eclipse >> 多线程synchronized有关问题
  详细解决方案

多线程synchronized有关问题

热度:27   发布时间:2016-04-23 00:39:45.0
多线程synchronized问题
最近在看多线程,一直对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或其子类中,没什么实际意义
  相关解决方案