美文网首页
多线程访问成员变量与局部变量

多线程访问成员变量与局部变量

作者: 哈利路亚911 | 来源:发表于2018-08-18 11:43 被阅读0次

    什么是线程安全?这个首先要明确。线程安全的类,值的是类内共享的全局变量的访问要保证在多线程下影响。由于多线程的访问,修改,便利读取从而使这些变量结构被破坏,或者针对这些变量的原子性被破坏,那么这个类就不是线程安全的。

    public class HelloThreadTest
    {
        public static void main(String[] args)
        {
            HelloThread r = new HelloThread();
    
            Thread t1 = new Thread(r);
            Thread t2 = new Thread(r);
    
            t1.start();
            t2.start();
    
        }
    
    }
    
    class HelloThread implements Runnable
    {
        int i;
    
        @Override
        public void run()
        {
    
            while (true)
            {
                System.out.println("Hello number: " + i++);
    
                try
                {
                    Thread.sleep((long) Math.random() * 1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
    
                if (50 == i)
                {
                    break;
                }
            }
    
        }
    }
    

    程序的执行结果是:顺次打印了0到49的数字,共50个数字。

    这是因为,i是成员变量,则HelloThread的对象r只包含这一个i,两个Thread对象因为由r构造,所以共享了同一个i。
    当我们改变代码如下时(原先的成员变量i被注释掉,增加了方法中的局部变量i):

    public class HelloThreadTest
    {
        public static void main(String[] args)
        {
            HelloThread r = new HelloThread();
    
            Thread t1 = new Thread(r);
            Thread t2 = new Thread(r);
    
            t1.start();
            t2.start();
    
        }
    
    }
    
    class HelloThread implements Runnable
    {
        // int i;
        // 若i是成员变量,则HelloThread的对象r只包含这一个i,两个Thread对象因为由r构造,所以共享了同一个i
        // 打印结果是0到49的数字
        @Override
        public void run()
        {
            int i = 0;
            // 每一个线程都会拥有自己的一份局部变量的拷贝
            // 线程之间互不影响
            // 所以会打印100个数字,0到49每个数字都是两遍
            while (true)
            {
                System.out.println("Hello number: " + i++);
    
                try
                {
                    Thread.sleep((long) Math.random() * 1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
    
                if (50 == i)
                {
                    break;
                }
            }
    
        }
    }
    

    由于局部变量对于每一个线程来说都是有自己的拷贝,所以各个线程之间不再共享一个变量,输出结果为100个数字,实际上是两组,每组都是0到49的50个数字,并且两组数字之间随意地穿插在一起。

    得到的结论如下:

    如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。

    如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。

    相关文章

      网友评论

          本文标题:多线程访问成员变量与局部变量

          本文链接:https://www.haomeiwen.com/subject/thvtiftx.html