Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程同步问题?_Java_Multithreading - Fatal编程技术网

Java多线程同步问题?

Java多线程同步问题?,java,multithreading,Java,Multithreading,我想我有一个同步问题…它可能太基本了..请帮助 我有一个线程,其运行方法如下 public void run() { while(true) { try { for (int i = 0; i < 100; i++) { buf.append(hello + (myint++)); } buf.ap

我想我有一个同步问题…它可能太基本了..请帮助

我有一个线程,其运行方法如下

 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);
            }

      }
但偶尔我会在str.length()行出现null指针异常……即使在第一次运行方法中尝试使用buf.toString()创建新字符串时,我也会遇到这种情况

我做错了什么


提前感谢..

这是因为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..

                                }
                     }

这是因为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..

                                }
                     }

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


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

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


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

你的错误在于:
buf
str
显然都是由多个线程非同步访问的实例或静态字段

看起来你几乎没有意识到这个概念。看起来
buf
str
都可以是局部变量(并且
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..
        }
    }
public void run()
{
while(true)
{
试一试{
StringBuffer buf=新的StringBuffer();
对于(int i=0;i<100;i++){
追加(hello+(myint++));
}
buf.追加(“\n”);
setData(buf.toString());
睡眠(1000);
}捕获(中断异常例外){
Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共布尔集合数据(字符串str){
if(str!=null&!str.equalsIgnoreCase(“”){
timer.scheduleAtFixedRate(新TimerTask(){
公开募捐{
System.out.println(“内部运行…”);
System.out.println(“str-length:-”+str.length());
//在这之后做某事。。
}
}

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

错误在于:
buf
str
显然都是非同步访问的实例或静态字段由多个线程执行

看起来您几乎不知道的概念。看起来
buf
str
都可能是局部变量(并且
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..
        }
    }
public void run()
{
while(true)
{
试一试{
StringBuffer buf=新的StringBuffer();
对于(int i=0;i<100;i++){
追加(hello+(myint++));
}
buf.追加(“\n”);
setData(buf.toString());
睡眠(1000);
}捕获(中断异常例外){
Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共布尔集合数据(字符串str){
if(str!=null&!str.equalsIgnoreCase(“”){
timer.scheduleAtFixedRate(新TimerTask(){
公开募捐{
System.out.println(“内部运行…”);
System.out.println(“str-length:-”+str.length());
//在这之后做某事。。
}
}

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

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

private static Object syncObject = new Object();
public String getStr(){
  synchronized (syncObject){
    return str;
  }
}
public void setStr(String value){
  synchronized (syncObject){
    str = value;
  }
}
并取而代之:

str=sb;
System.out.println("str length:- "+str.length());
尝试:

并取而代之:

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

请尝试:
System.out.println(“str-length:-”+getStr().length());

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

private static Object syncObject = new Object();
public String getStr(){
  synchronized (syncObject){
    return str;
  }
}
public void setStr(String value){
  synchronized (syncObject){
    str = value;
  }
}
并取而代之:

str=sb;
System.out.println("str length:- "+str.length());
尝试:

并取而代之:

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

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

谢谢你的回答。声明str为final有助于如下所述..我需要在内部类中使用它这不是“final”这很有帮助!它把它改成了一个局部变量。谢谢你的回答。声明str为final有帮助,如下所述。我需要它在内部类中它不是“final”有帮助的!它把它改成了一个局部变量有帮助的。