Thread_线程安全

count方法计算0-10的总和,并输出当前线程名,期望每个线程都打印出55.

public class MultiThreadDemo_01 {

    public static void main(String[] args){
        Runnable runnable = new Runnable(){
            Count count = new Count();
            @Override
            public void run() {
                count.count();
            }
        };
        for(int i=0;i<5;i++){
            new Thread(runnable).start();
        }
    }
}

class Count{
    int num=0;//全局变量
    public void count(){
        for(int i=0;i<=10;i++){
            num+=i;
        }
        System.out.println(Thread.currentThread().getName()+"==="+num);
    }
}

结果:只有一个线程输出55.为保证所有线程都打印出55

Thread-0===55
Thread-2===110
Thread-4===165
Thread-1===220
Thread-3===275

解决方案1:
全局变量num放在count方法内部

class Count{
    public void count(){
        int num=0;//count方法的局部变量
        for(int i=0;i<=10;i++){
            num+=i;
        }
        System.out.println(Thread.currentThread().getName()+"==="+num);
    }
}

解决方案2:
Count count = new Count();放在run方法中,这时count引用是线程内的局部变量
结果:所有线程都输出55.

Thread-0===55
Thread-3===55
Thread-4===55
Thread-1===55
Thread-2===55

解决方案3:每次启动一个线程使用不同的线程类,不推荐。

总结:存在成员变量的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的,日常开发中,通常需要考虑成员变量或者说全局变量在多线程环境下,是否会引发一些问题。

线程安全与共享资源
允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解Java线程执行时共享了什么资源很重要

你可能感兴趣的:(Thread_线程安全)