Java多线程同步问题?

时间:2009-09-01 11:19:43

标签: java multithreading

我认为我有同步问题......可能太基础......请帮助..

我有一个运行方法在

下面的线程
 public void run()
    {
      while(true)
      {
            try {
                for (int i = 0; i < 100; i++) {
                    buf.append(hello + (myint++));
                }
                buf.append("\n");
                adapter.setData(buf.toString());
                buf = null;
                buf = new StringBuffer();
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex);
            }

      }

我在每次运行中创建新的字符串数据并将其传递给适配器类setData方法..

在适配器类中,我的setData就是这样..

public boolean setData(String sb){

        str = sb;
        if(str != null && !str.equalsIgnoreCase("")){
            timer.scheduleAtFixedRate(new TimerTask() {
                public void run() {


                            System.out.println("inside run.....");
                        System.out.println("str length:- "+str.length());
                                //do sth after this..

                                }
                     }

但偶尔我会在str.length()行中得到空指针异常...即使我尝试在第一个run方法中使用buf.toString()创建一个新字符串,我也会得到这个。

我做错了什么?

提前致谢..

4 个答案:

答案 0 :(得分:2)

那是因为str是一个类变量。如果您没有理由为某人使用其他参考资料,请尝试以下方法:

public boolean setData(final String str){

        if(str != null && !str.equalsIgnoreCase("")){
                timer.scheduleAtFixedRate(new TimerTask() {
                public void run() {


                            System.out.println("inside run.....");
                                System.out.println("str length:- "+str.length());
                                //do sth after this..

                                }
                     }

答案 1 :(得分:2)

你做错了是这样的:bufstr显然是多个线程未经同步访问的实例或静态字段。

看起来你几乎不知道local variables的概念。看起来bufstr都可以是局部变量(并且str替换为sb方法参数)。尝试将代码更改为:

public void run()
{
  while(true)
  {
        try {
            StringBuffer buf = new StringBuffer();
            for (int i = 0; i < 100; i++) {
                buf.append(hello + (myint++));
            }
            buf.append("\n");
            adapter.setData(buf.toString());
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex);
        }

  }

public boolean setData(String str){
    if(str != null && !str.equalsIgnoreCase("")){
        timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            System.out.println("inside run.....");
            System.out.println("str length:- "+str.length());
            //do sth after this..
        }
    }

删除bufstr的实例或类声明。如果您确实在方法之外需要它们,请尝试通过返回值执行此操作,或者如果所有其他方法都失败,请使用synchronization

答案 2 :(得分:0)

问题是你根本没有同步。例如,正在从一个线程读取“str”字段并同时从另一个线程更新,而没有任何同步。

(如果你展示了一个完整且可运行的示例而不仅仅是认为有趣的部分会有所帮助。)

答案 3 :(得分:0)

尝试对“str”使用get和set方法,它将使用同步对象进行同步:

private static Object syncObject = new Object();
public String getStr(){
  synchronized (syncObject){
    return str;
  }
}
public void setStr(String value){
  synchronized (syncObject){
    str = value;
  }
}

并且输了:

str=sb;

尝试:

setStr(sb);

和insted:

System.out.println("str length:- "+str.length());

试:System.out.println("str length:- "+getStr().length());