java线程的共享变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程的共享变量相关的知识,希望对你有一定的参考价值。

我的程序没有返回预期的输出,我努力但我不知道该怎么做这个代码。我能做什么 ?

预期产出

1 2 3 4 5 6 7 8 ......2000

实际输出

1 2 3 4 5 6 1 2 3 4 5 6 ..1000

主要

public class Race_ConditonTest {

    public static void main(String[] args) {

        Race_Condition2 R1 = new Race_Condition2();
        Race_Condition2 R2 = new Race_Condition2();

        R1.start();
        R2.start();


   }
}

RaceCondition2(子类)

public class Race_Condition2 extends Thread{

    Race_Condition R= new Race_Condition();

    public void run() {
       R.sum();
    }   
}

RaceCondition类(超类)

public class Race_Condition  {
   int x=0;

   public int Load(int x){
       return x;
   }

    public void Store(int data) {
      int x= data;
      System.out.println(x);
    }

    public int Add(int i,int j) {
       return i+j ;
    }

    public void sum() {
       for (int i=0 ; i<1000 ; i++) { 
           this.x=Load(x);
           this.x=Add(x,1);
           Store(x);        
       }
    }
}
答案

我怎么分享x?

简单的方法>使x静态。

...

static int x=0;

......编辑

经过一些测试,如果你发现一些奇怪的事情,那么使Store功能同步。

  public synchronized void Store(int data) {
      int x= data;
      System.out.println(x);
    }

看看如何同步工作synchronized

另一答案

如果您的目标是在R1和R2之间共享属性x,则可以在RaceCondition类中使其成为静态。

static int x=0;

请注意,如果共享x,它们将同时访问它,因此可能产生一些奇怪的输出。创建访问x synchronized的函数(如here所述):

// static cause it only access a static field
// synchronized so the access the the shared resource is managed
public static synchronized void sum() {
   for (int i=0 ; i<1000 ; i++) { 
       this.x=Load(x);
       this.x=Add(x,1);
       Store(x);        
   }
}

您应该对其他功能进行相同的更改。

以上是关于java线程的共享变量的主要内容,如果未能解决你的问题,请参考以下文章

JAVA多线程提高三:线程范围内共享变量&ThreadLocal

java多线程执行任务,处理共享成员变量的安全问题

java线程的共享变量

Java并发编程——常见的线程安全问题

(黑马Java多线程与并发库高级应用)05 线程范围内共享变量的概念与作用

1 Java线程的内存可见性