java共享变量
㈠ java堆内存被所有线程所共享,不明白2个线程如何共享2个对象中的同名变量。
首先:堆内存共享是相对于栈内存的。栈是每一个线程都独有的,线程之间互不一向,每一个线程都有自己的栈内存。但是堆内存不一样,在一个JVM实例里面,不管你有多少线程,创建了多少对象,都是放在一块堆内存的。也就是说一个JVM实例栈内存区域是有多个,每一个线程持有一个,而堆内存只有一个,是线程共享的。
其次:针对你这个代码,这个情况下每一个线程确实是对应着不同的对象。也就是在同一个堆(也只有一个堆)里面创建了两个Demo对象。你老师的意思应该是
Demo demo = new demo();
Thread S1=new Thread(demo);
Thread S2=new Thread(demo);
这样两个线程都是操作堆内存共享的对象。
㈡ java多线程共享变量
两个线程同时获取变量,
获取之后.第一个线程++操作,然后进入睡眠.
这时,第二个线程,也获取到了,做--操作.睡眠.
第一个线程醒来打印的是做过2次运算的数据(++,--)所以是0
第二线程也一样.
这涉及到多线程安全问题.
㈢ java中如何理解多个对象共享同一个静态成员变量
要理解这个问题首先要知道一点,就是java的静态成员变量是有一个独立的存储空间的。
假设一个类里面如果有一个静态变量s,那个这个类的多个实例所引用的s实际上是同一个。举个例子吧
classA{
staticintnum=1;
privateStringname
publicStringgetName(Stringname){
returnname;
}
publicvoidsetName(Stringname){
{
this.name=name;
}
publicvoidshow(){
System.out.println("name:"+name+"num:"+num);
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
Aa=newA();
a.setName("caseA");
a.num++;
Ab=newA();
b.setName("caseB);
a.show();
b.show();
}
}
可以看到输出的num的值都是2
㈣ Java如何在几个Java文件中共享数据
java实现共享数据可以将这些要共享的数据封装到一个类里并且用静态static修饰,当其他类要使用这些变量时,只需用这个类的类名.变量名即可。
事例代码如下:
变量类:
public class Demo1 {
public static int a = 1;
public static int b = 2;
public static int c = 3;
}
使用变量的类:
public class Demo2 {
public static void main(String[] args) {
System.out.println(Demo1.a);
System.out.println(Demo1.b);
System.out.println(Demo1.c);
}
}
这里使用static的好处是变量经过static的修饰,在使用这些变量时不用再创建这个类出来,只需使用类名.变量名即可使用,节省了空间;还有需要注意的是变量名需要用public来修饰,保证再不同包下的类也能使用该类下的变量。
㈤ Java里如何做到一个变量成为共享数据
可以通过这个类的全局变量和定义一个减法的方法来实现呀.
按你说的例子我们可以这么写
首先,定义一个要被共享变量的类:
publicclassShare{
staticinta=100;//定义一个值为100的静态全局变量
publicstaticvoidminus(intvalue){//定义一个静态方法
a=a-value;
}
}
创建一个测试类
publicclassTest{
publicstaticvoidmain(String[]args){
Share.minus(10);//比如我们要给上面的a变量减10
System.out.println(Share.a);//输出之前定义的变量的结果为:90
}
}
㈥ 请教JAVA怎么编写多线程共享一个变量
多线程要么集成Thread类 要么实现Runnable 接口 入口都是public void run(){} 如果需要一个完善的可以做一个线程池.
㈦ java多线程中,共享数据变量 为什么一定要定义private权限
java是面向对象语言,一切成员都会封装在一个类中,定义成private是为了更好地隐藏,对外暴露的是setter和getter方法,所以可以通过setter设置值,getter来取值,达到模块隐藏的目的。