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