通过Thread来进一步理解static

114 阅读1分钟

static.png

a. 上述例子中通过创建两条线程来同时执行自己的start()方法,其最终目的是操作i++;

b. 结果如下

sout.png

c.当然了结果也可能为:

Thread-0执行了,i为2

Thread-1执行了,i为2 等等..

但本文不是来讨论Thread,而是通过Thread来进一步理解static

d. 如果我们把static关键字修饰去掉变为private int i;

inti.png

此时你就会发现结果永远是:

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);
    }
}