前提条件,把这个类设成是单例模式,也就是说,这个类只能创建一个对象,然后多个线程在一个对象中去争抢资源.
1.int类型的成员变量number, (private int number) 线程共享
public class Stu {
private int number;
private String age;
private String math;
private int[] shuzu= {1,2,3} ;
public void aa(){
number++;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(number);
}
@Component
public class MyRunnable implements Runnable{
@Override
public void run(){
//创建出stu的单例对象
Stu stu = Stu.getInstance();
stu.aa();
//把stu对象的地址打印出来
System.out.println(Thread.currentThread().getName()+" 嘿嘿 "+System.identityHashCode(stu));
}
}
public class testb {
public static void main(String[] args) {
//创建线程池
ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
pool.submit(new MyRunnable());
}
pool.shutdown();
}
}
创建10个线程去执行stu对象的成员变量的number++;最后发现结果发生了线程并发争抢.控制台打印出来的结果都是10.
因此,证实(private int number) 这种int 类型的成员变量是线程共享的.
2.在方法里定义一个局部变量 int number =0,让10个线程去执行 线程不共享
创建10个线程去执行stu对象的aa()方法里的局部变量的number++;最后发现结果都是1.
因此,证实写在方法里的(int number =0) 这种int 类型的局部变量不是线程共享的.
2.在方法里定义一个局部变量 int [] arr = new int[3]
结果证实,虽然是在同一个对象的里的同一个方法的同一个int[] 数组, 来了10个线程去执行new后,发现最后new出的10个int[]数组的对象的内存地址都是不一样的,
得出结论, (int [] arr=new int[]{0})这种在成员方法里的局部变量, 每个线程都会自己去new一个数组出来, 会在堆中new出10个地址不同的数组来,然后每个线程执行的时候各找各的new出的数组,所以它们互不影响,
所以, 数组作为局部变量,可以可以认为是线程不共享的,是线程安全的.