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线程执行时共享了什么资源很重要

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,219评论 30 472
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,678评论 25 708
  • 有的生命出生于地球,有的生命出生在外星。 有的生在水里,有的长在地上。 有的吃草,有的吃吃草的。为什么会这样? 当...
    4d8ef48cfd78阅读 198评论 0 0
  • 校园时期,我总是更愿意相信精神富裕比物质富裕来得重要。在能满足温饱的前提下,我对“钱”这个字实在没有太大的概念。虽...
    人生不怕重来阅读 1,060评论 0 1