a. 上述例子中通过创建两条线程来同时执行自己的start()方法,其最终目的是操作i++;
b. 结果如下
c.当然了结果也可能为:
Thread-0执行了,i为2
Thread-1执行了,i为2 等等..
但本文不是来讨论Thread,而是通过Thread来进一步理解static
d. 如果我们把static关键字修饰去掉变为private int i;
此时你就会发现结果永远是:
Thread-0执行了,i为1
Thread-1执行了,i为1
e. 由此可以更加清楚的明白,定义一个变量后,可以简单理解为它是属于当前方法的,创建线程t后,t执行start()方法,它操作的i是自己的。定义线程t2同样是这个道理,它操作的i也是自己的,所以结果很简单,两个线程执行后的i的值都是1.
f. 而加static修饰后,它就是全局共享变量(全局变量存放于堆空间),顾名思义"全局的"嘛,所以大家都可以用也都再用,也叫静态变量。所以,t和t2共享一个变量,当然了i的结果就一直在变,因为此处代码没加锁,它俩也不管到底有没有人执行。
g. 测试代码:
public class test {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
try {
t.start();
} catch (Exception e) {
throw new RuntimeException();
}
try {
t2.start();
} catch (Exception e) {
throw new RuntimeException();
}
}
}
class MyRunnable implements Runnable {
//private static int i;
private int i;
@Override
public void run() {
i++;
System.out.println(Thread.currentThread().getName() + "执行了,i为" + i);
}
}